LLM+RAG开辟实战:开辟情况搭建与检索增强代码实现

打印 上一主题 下一主题

主题 985|帖子 985|积分 2955

准备情况

miniconda

作用:

  • ​虚拟情况:为每个项目创建独立的Python情况(如Python 3.10),避免全局安装导致版本冲突。
  • ​依赖管理:通过conda或pip精准安装AI框架(如PyTorch、LangChain),解决库版本兼容性问题。
安装:

  • 下载地址:miniconda下载 下载一个较新版本,比方:Miniconda3-py312_24.11.1-0-Windows-x86_64.exe
  • 安装
  • 编辑Path变量,新增:D:\ProgramData\miniconda3 D:\ProgramData\miniconda3\Scripts D:\ProgramData\miniconda3\Library\bin ,验证:打开cmd,输入conda info,看到信息说明配置成功
ollama

作用:

  • ​开箱即用:无需配置复杂情况,直接下载运行Llama3、Mistral等开源大模型。
  • ​简化交互:提供雷同OpenAI的REST API,方便通过代码调用模型天生文本。
  • ​轻量化:支持CPU/GPU运行,适合本地测试和小规模部署。
安装:

  • 下载地址:ollama下载
  • 安装
  • 情况变量:新增系统变量OLLAMA_MODELS=D:\OllamaModels
向量数据库

这里使用的是Chroma,需要通过pip安装langchain-chroma库
作用:

  • ​存储向量:将文本、图片等数据转换为向量(一组数字),实现语义检索。
  • ​加快检索:通过近似算法(如Faiss)快速查找相似内容,支持大模型的RAG(检索增强天生)。
​典型工具:

  • Chroma(轻量级)
  • Milvus(高性能)
python虚拟情况


  • 创建python虚拟情况:conda create -n llm-rag python=3.12.8
  • 进入情况:conda activate llm-rag
  • 安装相干包:pip install langchain langchain-community langchain-ollama langchain-chroma jupyterlab
库说明


  • LangChain 是一个用于构建基于大语言模型(LLMs)应用步伐的开源框架,目的是简化将语言模型与其他工具、数据源和业务逻辑集成的流程,帮助开辟者快速开辟对话系统、问答工具、自动化工作流等AI应用。
  • langchain-community 是 LangChain 生态系统中的一个官方子包,用于存放由社区贡献或维护的第三方集成、工具和扩展。它的主要目的是将非核心功能从主包 langchain 中分离出来,使 LangChain 的核心库更加轻量,同时允许社区更灵活地维护和更新外部依赖的功能。
  • langchain-ollama 是一个将 ​LangChain 框架与 ​Ollama 工具集成的库,旨在简化在本地情况中使用大型语言模型(LLMs)开辟应用的流程。
  • langchain-chroma 是 LangChain 框架与 Chroma 向量数据库的集成组件,用于在基于大型语言模型(LLM)的应用中高效存储、检索文本数据的向量嵌入。
  • JupyterLab 是一款开源的交互式开辟情况(IDE)​,专为数据科学、机器学习和科学计算设计。它是传统 Jupyter Notebook 的升级版,提供了更现代化、灵活的界面和功能,支持用户在一个集成的 Web 界面中同时使用多种工具(如代码编辑器、Notebook、终端、可视化工具等)。输入jupyter lab回车即可打开jupyterlab页面。可以使用jupyterlab编写代码,但这里使用的是PyCharm开辟工具。
下载模型


  • ollama pull deepseek-r1:1.5b
  • ollama pull autumnzsd/nlp_gte_sentence-embedding_chinese-large:latest
PyCharm


  • 请安装PyCharm较新版本,比方:PyCharm 2024.3.4
  • 创建新项目:File -> New Project...
  • Interpreter Type选择Custom environment, Type选择Conda, Path to conda选择D:\ProgramData\miniconda3_conda.exe, Environment选择之前创建的D:\ProgramData\miniconda3\envs\llm-rag, 点击Create创建, 然后就可以创建py文件开辟了。
代码实现

知识库文本分割与向量化存储
  1. from langchain_community.document_loaders import TextLoader  # 导入文本
  2. from langchain_text_splitters import RecursiveCharacterTextSplitter  # 文本切割
  3. from langchain_ollama import OllamaEmbeddings  # 绑定向量模型
  4. from langchain_chroma import Chroma  # 数据向量化入库
  5. import os
  6. def saveToVectorDB(filePath):
  7.     loader = TextLoader(filePath, encoding="utf-8")
  8.     txt = loader.load()
  9.     print(txt)
  10.     textSpliter = RecursiveCharacterTextSplitter(
  11.         separators=["\n\n", "\r\n", "\n", "。", ".", "!", "!", ",", ",", "、", " ", ""],
  12.         chunk_size=150,
  13.         chunk_overlap=50,
  14.     )
  15.     allSpliter = textSpliter.split_documents(txt)
  16.     print(allSpliter)
  17.     # 绑定向量模型
  18.     Embeddings = OllamaEmbeddings(model="autumnzsd/nlp_gte_sentence-embedding_chinese-large:latest")
  19.     # 数据向量化入库
  20.     persist_dir = "./vector_db"
  21.     if os.path.exists(persist_dir):
  22.         db = Chroma(
  23.             embedding_function=Embeddings,
  24.             persist_directory=persist_dir,
  25.             collection_metadata={"hnsw:space": "cosine"}
  26.         )
  27.         db.add_documents(documents=allSpliter)
  28.     else:
  29.         db = Chroma.from_documents(
  30.             documents=allSpliter,
  31.             embedding=Embeddings,
  32.             persist_directory=persist_dir,
  33.             collection_metadata={"hnsw:space": "cosine"}
  34.         )
  35.     print("count=", db._collection.count())
  36. saveToVectorDB(os.getcwd() + "\\docs\\断网离线部署方法.txt")
  37. saveToVectorDB(os.getcwd() + "\\docs\\公司产品手册.md")
  38. saveToVectorDB(os.getcwd() + "\\docs\\公司员工手册(AI生成).md")
复制代码
向量数据库查询
  1. from langchain_ollama import OllamaEmbeddings
  2. from langchain_chroma import Chroma
  3. def queryVectorDB(queryText):
  4.     # 绑定向量模型
  5.     Embeddings = OllamaEmbeddings(model="autumnzsd/nlp_gte_sentence-embedding_chinese-large:latest")
  6.     db = Chroma(persist_directory="./vector_db", embedding_function=Embeddings)
  7.     # 查询
  8.     # retriever = db.as_retriever(search_kwargs={"k": 3})
  9.     retriever = db.as_retriever(search_type="similarity_score_threshold",
  10.                                 search_kwargs={"k": 10, "score_threshold": 0.48})
  11.     results = retriever.invoke(queryText)
  12.     return "\n\n".join(doc.page_content for i, doc in enumerate(results, start=1))
复制代码
基于RAG的DeepSeek模型问答实现
  1. from langchain_core.prompts import ChatPromptTemplate  # 构建prompt
  2. from langchain_ollama import ChatOllama  # 使用ollama进行回答
  3. from langchain_core.output_parsers import StrOutputParser  # 输出格式化
  4. import QueryVectorDB
  5. def chat(question):
  6.     dbResult = QueryVectorDB.queryVectorDB(question)
  7.     # prompt模板
  8.     prompt = ChatPromptTemplate.from_template("""
  9.     请根据已知信息回答问题
  10.    
  11.     ## 已知信息:
  12.     {context}
  13.    
  14.     ## 问题:
  15.     {question}
  16.    
  17.     ## 限制:
  18.     - 回答时请注意问题和已知信息的相关性。
  19.     - 只回答与已知信息相关的问题,拒绝回答无关话题。
  20.     - 所输出的内容必须逻辑清晰、有条理。
  21.     - 回答内容需基于已知信息,若已知信息中无相关内容,需明确告知用户无对应答案。
  22.     """)
  23.     llm = ChatOllama(model="deepseek-r1:1.5b")  # 绑定大模型
  24.     output_parser = StrOutputParser()  # 过滤不需要的输出信息
  25.     rag_chain = prompt | llm | output_parser  # 绑定之前的config
  26.     result = rag_chain.invoke({"question": question, "context": dbResult})
  27.     return result
  28. result = chat("华为公司员工的工作时间是几点到几点?")
  29. print("deepseek回答1:\n", result)
  30. result = chat("在华为工作了13年的员工能享受几天带薪年假?")
  31. print("deepseek回答2:\n", result)
  32. result = chat("华为公司有哪些保密规定?")
  33. print("deepseek回答3:\n", result)
  34. result = chat("华为Mate系统系列手机的特点是什么?")
  35. print("deepseek回答4:\n", result)
  36. result = chat("如何使用ollama离线部署deepseek?")
  37. print("deepseek回答5:\n", result)
复制代码
完备源码

https://gitee.com/s0611163/llm-rag-demo
结束语

这是我首次学习大模型的实践,不足之处欢迎大家指正。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表