一个基于 WordPress 搭建的个人技术博客,专注于 Linux 运维、网络架构、自动化运维、虚拟化、GPU 服务器部署及企业级基础设施实践经验分享。
构建RAG系统:使用LangChain和Pinecone实现文档智能问答
构建RAG系统:使用LangChain和Pinecone实现文档智能问答

构建RAG系统:使用LangChain和Pinecone实现文档智能问答

1. 业务场景与目标

公司内部有大量技术文档,如开发指南、API文档和故障排除手册。员工在查找信息时效率低下,经常需要翻阅多个文件。目标是构建一个RAG系统,通过检索增强生成技术,将文档索引到向量数据库Pinecone,结合LangChain和生成模型,实现快速、准确的智能问答。这能提升员工查询效率,减少错误,适合企业内部知识管理场景。

2. 环境准备

使用uv作为Python包管理器快速安装依赖。首先,确保安装了uv(可通过pip install uv安装),然后创建项目目录并初始化依赖。核心依赖包括LangChain、Pinecone客户端、OpenAI库等。

# 初始化项目并安装依赖
uv init rag_project && cd rag_project
uv add langchain pinecone-client openai python-dotenv tiktoken

依赖说明:

  • langchain:构建RAG链的核心框架。
  • pinecone-client:连接Pinecone向量数据库。
  • openai:用于文本嵌入和生成。
  • python-dotenv:管理环境变量如API密钥。
  • tiktoken:用于文本分块和Token计数。

3. 数据说明

假设我们有企业内部技术文档,以Markdown格式存储。如果没有真实数据,可以模拟生成示例文档来演示逻辑。以下代码模拟生成10个简单的技术文档片段。

# 模拟数据生成逻辑
import os
from langchain.schema import Document

# 创建模拟文档目录
os.makedirs('data', exist_ok=True)
# 生成示例文档内容
tech_docs = [
    "如何配置Docker容器:使用docker run命令,设置环境变量ENV=prod。",
    "API认证指南:调用前需获取token,有效期为24小时。",
    "故障排除:服务器500错误,检查日志文件/var/log/app.log。",
    "数据库备份步骤:使用pg_dump工具,每天凌晨执行。",
    "前端部署:运行npm build后,上传到CDN。",
    "安全最佳实践:定期更新密码,启用双因素认证。",
    "监控指标:CPU使用率超过80%时发送警报。",
    "CI/CD流水线:使用GitHub Actions,集成测试自动化。",
    "代码审查流程:提交PR后,至少两名同事审核。",
    "数据迁移脚本:使用Python pandas,处理CSV文件导入。"
]
# 转换为Document对象
documents = [Document(page_content=doc, metadata={"source": f"doc_{i}"}) for i, doc in enumerate(tech_docs)]
print(f"生成{len(documents)}个文档示例")

数据口径:文档为纯文本,每行一个知识点,用于演示索引和检索。

4. 训练/实现步骤

以下是构建RAG系统的完整代码,包括文档索引和问答链设置。确保已设置环境变量OPENAI_API_KEYPINECONE_API_KEY

# 完整实现步骤:加载文档、索引到Pinecone、设置RAG链
import os
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Pinecone
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
import pinecone

# 加载模拟文档(使用上一步生成的documents变量)
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=50)
texts = text_splitter.split_documents(documents)

# 初始化嵌入模型和Pinecone
embeddings = OpenAIEmbeddings()
pinecone.init(api_key=os.getenv('PINECONE_API_KEY'), environment='us-east1-gcp')
index_name = 'rag-tech-docs'
# 检查并创建Pinecone索引
if index_name not in pinecone.list_indexes():
    pinecone.create_index(index_name, dimension=1536, metric='cosine')
# 索引文档到Pinecone
docsearch = Pinecone.from_documents(texts, embeddings, index_name=index_name)
print("文档索引完成,可用于检索")

# 设置检索和生成链
retriever = docsearch.as_retriever(search_kwargs={"k": 3})
llm = OpenAI(temperature=0)  # 使用OpenAI GPT模型,温度0降低随机性
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)
print("RAG问答链准备就绪")

任务类型:这是一个AI工程化部署任务,具体是文档检索与生成的管道构建。

5. 调用方式

提供离线批量索引和单条问答示例。离线批量索引已在上一步完成,这里展示单条查询的调用。

# 单条问答示例
query = "如何配置Docker容器?"
answer = qa_chain.run(query)
print(f"问题: {query}\n回答: {answer}")
# 离线批量处理示例:假设有新文档需要索引
new_docs = [Document(page_content="新文档内容:Kubernetes部署指南。", metadata={"source": "new_doc"})]
new_texts = text_splitter.split_documents(new_docs)
Pinecone.from_documents(new_texts, embeddings, index_name=index_name)
print("新文档批量索引完成")

6. 指标说明

  • RAG (Retrieval-Augmented Generation):一种AI技术,先检索相关文档,再用生成模型基于检索结果回答问题,提高准确性。
  • 向量数据库 (如Pinecone):存储文本的向量嵌入,通过计算相似度快速检索相关文档。
  • 嵌入 (Embedding):将文本转换为数字向量,使机器能理解语义相似性。
  • 召回率 (Recall):检索系统找到所有相关文档的比例,越高越好。
  • 准确率 (Accuracy):生成回答的正确性,可通过人工评估衡量。
  • 幻觉回答 (Hallucination):生成模型产生不基于检索内容的虚假信息。
  • 检索链 (RetrievalQA):LangChain中的组件,组合检索器和生成模型进行问答。

7. 上线后评估

系统上线后,监控以下运行指标:

  • 查询延迟:每次问答的响应时间,目标低于2秒。
  • 准确率:随机抽样问答,由专家评估回答是否正确,目标大于90%。
  • 召回率:测试查询时,检查是否检索到所有相关文档。 评估方法:使用测试集进行自动化测试,并定期人工审核,调整检索参数或文档分块策略。

8. 常见坑与排查

  • API密钥错误:确保OPENAI_API_KEYPINECONE_API_KEY已正确设置环境变量,可通过os.getenv检查。
  • 检索精度低:文档质量差或分块不当;增大分块重叠或调整分块大小,例如设置chunk_size=200chunk_overlap=50
  • 生成幻觉回答:降低生成模型温度(如temperature=0),并确保检索文档相关;可添加后处理过滤。
  • Pinecone索引不存在:运行前检查索引名称,使用pinecone.list_indexes()确认。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

+ 68 = 75