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