实战

LangChain实战:从零构建企业级知识问答系统

| 2025-11-16 18:13 | 1907 浏览
# LangChain实战:构建智能问答系统 ## 项目简介 LangChain是一个强大的AI应用开发框架,它简化了大语言模型(LLM)应用的开发过程。本文将带你从零开始,使用LangChain构建一个基于企业文档的智能问答系统。 ## 技术架构 我们将构建的系统采用RAG(Retrieval Augmented Generation)架构,主要包含以下组件: 1. **文档加载器**: 加载PDF、Word、Markdown等格式的文档 2. **文本分割器**: 将长文档分割成适合处理的小块 3. **向量数据库**: 存储文档的向量表示,支持相似度搜索 4. **LLM**: 基于检索结果生成回答 ## 环境准备 首先安装必要的依赖: ```bash pip install langchain langchain-openai chromadb pypdf ``` ## 第一步:文档加载与处理 ```python from langchain.document_loaders import PyPDFLoader, DirectoryLoader from langchain.text_splitter import RecursiveCharacterTextSplitter # 加载PDF文档 loader = DirectoryLoader("./docs", glob="**/*.pdf", loader_cls=PyPDFLoader) documents = loader.load() # 文本分割 text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200, length_function=len, ) texts = text_splitter.split_documents(documents) print(f"共分割成 {len(texts)} 个文本块") ``` 分割策略很重要,chunk_size决定了每个文本块的大小,chunk_overlap则确保重要信息不会在边界处丢失。 ## 第二步:创建向量数据库 ```python from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Chroma # 创建嵌入模型 embeddings = OpenAIEmbeddings() # 创建向量数据库 vectorstore = Chroma.from_documents( documents=texts, embedding=embeddings, persist_directory="./chroma_db" ) # 持久化存储 vectorstore.persist() ``` Chroma是一个轻量级的向量数据库,适合开发和小规模部署。对于生产环境,可以考虑使用Pinecone或Weaviate。 ## 第三步:构建问答链 ```python from langchain.chat_models import ChatOpenAI from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate # 自定义提示模板 prompt_template = """基于以下上下文回答问题。如果无法从上下文中找到答案,请说"我无法根据提供的信息回答这个问题"。 上下文: {context} 问题:{question} 请用中文回答:""" PROMPT = PromptTemplate( template=prompt_template, input_variables=["context", "question"] ) # 创建LLM llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0) # 创建问答链 qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=vectorstore.as_retriever(search_kwargs={"k": 3}), chain_type_kwargs={"prompt": PROMPT}, return_source_documents=True ) ``` ## 第四步:测试问答系统 ```python def ask_question(question): result = qa_chain({"query": question}) print(f"问题: {question}") print(f"回答: {result["result"]}") print("参考来源:") for doc in result["source_documents"]: print(f" - {doc.metadata["source"]}") return result # 测试 ask_question("公司的请假政策是什么?") ``` ## 优化技巧 ### 1. 检索优化 - 使用混合检索(关键词+语义) - 调整返回文档数量k的值 - 添加元数据过滤 ### 2. 提示优化 - 根据业务场景定制提示模板 - 添加few-shot示例 - 使用思维链(CoT)提示 ### 3. 性能优化 - 使用缓存减少重复查询 - 批量处理文档嵌入 - 考虑使用更快的嵌入模型 ## 部署建议 1. **API服务**: 使用FastAPI包装成REST API 2. **前端界面**: 使用Streamlit或Gradio快速构建 3. **监控**: 添加日志记录和性能监控 4. **安全**: 实现用户认证和权限控制 ## 总结 通过LangChain,我们可以快速构建功能完整的知识问答系统。RAG架构结合了检索和生成的优势,既能保证回答的准确性,又能提供流畅的自然语言回复。
LangChainRAG问答系统向量数据库Python
112 点赞 18 评论

评论 (0)

登录后发表评论。

暂无评论。成为第一个评论的人吧!