文档目录
-
一、总体说明与介绍
-
二、为什么使用RAG
- 优点与使用场景
-
三、环境搭建
- 环境依赖与安装步骤
- 模型安装与启动
-
四、完整的RAG代码示例
- 代码实现与说明
-
五、优化建议
- 性能优化建议
- 使用技巧提示
一、总体说明与介绍
RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合向量检索和生成式语言模型(LLM)的新型技术。它通过实时从外部知识库中检索相关的知识片段作为上下文,增强模型对问题回答的准确性与实时性,广泛应用于企业内部知识库、智能客服、医疗咨询等领域。
本技术文档将指导您如何使用LangChain框架结合Ollama服务,搭建一个本地运行的高效RAG知识库。
二、为什么使用RAG
优点 | 说明 | 推荐使用场景 |
---|---|---|
实时更新 | 无需频繁重新训练模型即可更新知识库内容 | 企业内部知识库,实时信息更新场景 |
提升准确性 | 减少语言模型"幻觉"现象,提高答案准确性 | 法律咨询、医疗健康 |
降低成本 | 维护知识库成本远低于重新训练大型模型 | 小型公司内部知识库、客服 |
数据私密性 | 数据本地存储和处理,保护隐私安全 | 企业私有数据处理 |
三、环境搭建
环境依赖与安装步骤
软件或包名称 | 安装方式 | 作用说明 |
---|---|---|
LangChain | pip install langchain langchain-community |
链式调用AI任务,文档加载 |
ChromaDB | pip install chromadb |
本地向量数据库 |
Ollama | 官网安装 | 本地运行LLM |
sentence-transformers | pip install sentence-transformers |
向量嵌入 |
文档处理库 | pip install pypdf "unstructured[all-docs]" python-docx python-pptx lxml openpyxl |
加载多种文档类型,如PDF、Word、Excel等 |
三、模型安装与启动
操作 | 命令 | 说明 |
---|---|---|
启动Ollama | ollama serve |
启动Ollama本地模型服务 |
下载DeepSeek模型 | ollama pull deepseek-r1:1.5b |
下载本地LLM模型用于问答 |
下载嵌入模型 | ollama pull nomic-embed-text:latest |
文本转向量的嵌入模型 |
四、完整的RAG代码示例
以下是完整的Python示例代码,使用LangChain实现基于Ollama的本地RAG知识库。
css
import os
from langchain_community.document_loaders import PyPDFLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain_ollama import OllamaEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import Ollama
def load_documents(file_paths):
loaders = []
for path in file_paths:
if path.endswith(".pdf"):
loaders.append(PyPDFLoader(path))
elif path.endswith(".txt"):
loaders.append(TextLoader(path))
docs = []
for loader in loaders:
docs.extend(loader.load())
return docs
# 用户输入多个文件
file_list = []
while True:
input_path = input("请输入文件路径(输入'q'结束):")
if inputWord.lower() == 'q':
break
file_list.append(input_path)
documents = load_documents(file_list)
# 文档分割与向量存储
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
splits = text_splitter.split_documents(documents)
embeddings = OllamaEmbeddings(model="nomic-embed-text:latest")
db = Chroma.from_documents(splits, embeddings)
retriever = db.as_retriever()
llm = Ollama(model="deepseek-r1:1.5b")
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)
# 交互式问答
print("知识库已就绪,可以开始提问(输入q退出):")
while True:
query = input("问题:")
if query.lower() == "q":
break
result = qa_chain.invoke(query)
print("回答:", result)
五、优化建议
- 调整
chunk_size
(如300~1000字符)提高检索的准确性。 - 根据应用需求调整检索文档数量
k
(默认3-5个)提升答案相关度。 - 使用量化模型(如DeepSeek量化版)减少内存占用,提高响应速度。
💡
Tips
- 定期更新知识库文档,确保提供最新信息。
- 在安全要求较高的环境中,推荐使用本地部署的Ollama模型以确保数据安全