基于LangChain与RAG技术构建金融智能问答机器人实战指南 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度如果你正在关注大模型应用开发或者想找一个能快速把大模型能力集成到业务里的框架那 LangChain 这个名字你肯定绕不过去。它不是一个具体的模型而是一个帮你“组装”和“编排”大模型应用的开发框架。简单说它解决的核心问题是如何把像 OpenAI GPT、通义千问这样的 LLM和你自己的数据、工具、业务流程稳定、高效地连接起来变成一个可用的应用。比如你想做一个基于公司文档的智能问答机器人或者一个能自动调用 API 完成复杂任务的智能体LangChain 提供了一套标准化的组件和模式让你不用从零开始造轮子。很多人第一次接触会觉得概念很多像 Chains、Agents、RAG、Memory 等等。但别被这些术语吓住它的核心价值就两点一是标准化了 LLM 应用的开发模式二是极大地提升了开发效率。对于开发者尤其是需要快速验证 AI 应用可行性的团队LangChain 能帮你省下大量处理琐碎工程问题的时间比如上下文管理、工具调用、对话历史维护等。下面我会以一个真实的“金融大模型问答机器人”项目为蓝本带你从零开始拆解如何用 LangChain 为核心技术栈一步步把一个想法落地成可用的服务。我会重点讲清楚环境怎么搭、核心流程怎么设计、代码怎么写、关键参数怎么调、以及上线前后最容易踩的坑在哪里。整个过程我会假设你有一台能跑 Python 的开发机并且对 Python 和 API 调用有基本了解。1. 项目拆解从需求到技术选型在动手写代码之前先得把项目想清楚。我们假设这样一个场景一家金融机构需要为内部员工和部分客户提供一个智能问答助手能回答关于公司产品、市场报告、内部规章等文档内容的问题。需求很明确准确、快速、能处理大量非结构化文档并且回答要基于给定的资料不能胡编乱造。1.1 核心需求与技术映射面对这个需求直接让大模型去“背诵”所有文档是不现实的因为文档太多会远超模型的上下文长度。这时就需要引入RAG检索增强生成技术。它的流程是用户提问 - 从文档库中检索相关片段 - 将片段和问题一起交给大模型 - 模型生成基于这些片段的答案。LangChain 在这里扮演的就是“流程编排者”和“组件提供者”的角色。我们需要用它来文档加载与处理读取 PDF、Word、TXT 等格式的文档。文本分割与向量化将长文档切成语义连贯的小块并转换成向量嵌入存入向量数据库。检索根据用户问题从向量库中找出最相关的文本块。提示工程与生成设计一个清晰的提示词模板把问题和检索到的文本块组合起来发送给 LLM 生成答案。记忆与对话如果需要多轮对话还要管理历史消息。1.2 技术栈确定基于以上分析我们可以确定项目的主要技术栈LLM 模型Qwen通义千问。选择它是因为其在中文理解和生成上表现优秀并且有不错的开源版本可供本地或云端部署。作为备选也会考虑OpenAI APIGPT-4/3.5用于快速原型验证。核心框架LangChain。这是我们的总装线。向量数据库与检索LangChain集成了多种向量库。这里我们选择Chroma因为它轻量、易用适合快速开发和中小规模数据。生产环境可能会考虑Weaviate或Pinecone。后端 API 服务FastAPI。轻量、异步支持好、自动生成 API 文档非常适合构建 AI 应用的接口层。RAG 增强使用 LangChain 的标准RAG链。对于更复杂的、需要多步推理或工作流的场景可以探索LangGraphLangChain 的一个子库用于构建有状态的、图结构的工作流。高级优化技术可选/后期LoRA/SFT如果通用模型在特定金融术语上表现不佳可以考虑用小规模数据对基座模型进行高效微调。PPO/RLHF如果需要根据人类反馈优化回答风格和质量。知识蒸馏将大模型的知识迁移到更小、更快的模型上以降低部署成本。量化减少模型权重精度以降低内存占用和提升推理速度。为什么是 LangChain而不是直接调用 API你可以直接写代码调用 Qwen 的 API然后自己写文档加载、分割、检索的逻辑。但 LangChain 把这些都模块化了。当你的需求从“简单问答”变成“需要联网搜索”或“需要执行计算”时直接调用 API 就需要大改架构。而 LangChain 通过Agent和Tool的概念能让你像搭积木一样增加新能力维护成本低得多。2. 环境搭建与核心依赖安装理论清楚了我们开始动手。首先确保你的开发环境是干净的。2.1 创建虚拟环境与安装我强烈建议使用虚拟环境来管理依赖避免包冲突。# 创建并激活虚拟环境 (以 conda 为例也可用 venv) conda create -n finance-qa python3.10 conda activate finance-qa # 安装核心依赖 pip install langchain langchain-community langchain-chroma # LangChain 核心及 Chroma 集成 pip install chromadb # Chroma 向量数据库客户端 pip install sentence-transformers # 用于生成文本向量的嵌入模型 pip install pypdf python-docx markdown # 支持多种格式的文档加载器 pip install fastapi uvicorn # Web 框架和 ASGI 服务器 pip install openai # 如需使用 OpenAI API # 安装 Qwen 相关这里假设使用 DashScope API如需本地部署则安装 vllm 或 transformers pip install dashscope注意版本LangChain 更新较快如果遇到兼容性问题可以尝试指定稍早的稳定版本例如pip install langchain0.1.0。但通常建议使用最新版并关注其官方文档的迁移指南。2.2 关键组件初始化嵌入模型和 LLM嵌入模型负责把文本变成向量。对于中文sentence-transformers库里的paraphrase-multilingual-MiniLM-L12-v2是一个不错的开源选择它支持多语言且在 CPU 上也能跑。对于生产环境可以考虑性能更好的模型或商用嵌入 API。# 文件config.py 或类似配置文件 from langchain_community.embeddings import HuggingFaceEmbeddings # 初始化嵌入模型 embed_model HuggingFaceEmbeddings( model_namesentence-transformers/paraphrase-multilingual-MiniLM-L12-v2, model_kwargs{device: cpu}, # 如果有 GPU 可改为 cuda encode_kwargs{normalize_embeddings: True} # 通常归一化有利于相似度计算 )接下来初始化 LLM。这里展示两种方式使用云端 Qwen API 和本地部署假设已通过其他方式部署好并使用类似 OpenAI 的接口。# 方式一使用阿里云 DashScope 的 Qwen API (需要 API KEY) from langchain_community.llms import Tongyi import os os.environ[DASHSCOPE_API_KEY] your-dashscope-api-key llm Tongyi(modelqwen-max) # 或 qwen-plus, qwen-turbo 等 # 方式二使用本地部署的类 OpenAI 接口的模型 (例如用 vLLM 部署的 Qwen) from langchain_openai import OpenAI # 假设你的本地服务地址是 http://localhost:8000/v1 llm OpenAI( base_urlhttp://localhost:8000/v1, api_keyno-key-required, modelQwen-7B-Chat # 模型名需与部署一致 )关键选择初期验证和开发使用云端 API如 DashScope速度最快免去部署烦恼。一旦确定流程并且对成本、数据隐私有要求再考虑本地化部署。本地部署涉及模型下载、推理框架如 vLLM, TensorRT-LLM选择、GPU资源等是另一个复杂课题。3. 实现核心 RAG 流程从文档到答案环境准备好后我们开始实现最核心的“文档入库 - 检索 - 回答”流水线。3.1 第一步文档加载与处理假设你的金融文档放在./data/目录下有 PDF、Word 等格式。LangChain 提供了大量的DocumentLoader。# 文件ingest.py from langchain_community.document_loaders import PyPDFLoader, Docx2txtLoader, TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter import os def load_and_split_documents(data_dir./data): documents [] for filename in os.listdir(data_dir): file_path os.path.join(data_dir, filename) if filename.endswith(.pdf): loader PyPDFLoader(file_path) elif filename.endswith(.docx): loader Docx2txtLoader(file_path) elif filename.endswith(.txt): loader TextLoader(file_path, encodingutf-8) else: continue # 跳过不支持的文件 loaded_docs loader.load() documents.extend(loaded_docs) print(fLoaded {len(loaded_docs)} documents from {filename}) # 文本分割这是影响 RAG 效果的关键步骤 text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每个块的最大字符数 chunk_overlap50, # 块之间的重叠字符避免语义被切断 separators[\n\n, \n, 。, , , ] # 分割符优先级 ) all_splits text_splitter.split_documents(documents) print(fSplit into {len(all_splits)} chunks.) return all_splits参数调优重点chunk_size和chunk_overlap。chunk_size太小检索到的信息可能不完整太大可能包含无关噪声且会占用更多 LLM 上下文。对于金融文档段落结构清晰500-1000 是个不错的起点。chunk_overlap保证关键信息如一段话的结尾和下一段的开头不会因为恰好被切开而丢失。3.2 第二步构建向量数据库将分割好的文本块转换成向量并存入 Chroma。# 接上段代码 from langchain_chroma import Chroma from config import embed_model # 导入前面定义的嵌入模型 def create_vectorstore(document_splits, persist_directory./chroma_db): # 创建向量存储。persist_directory 指定持久化路径下次启动可直接加载无需重新计算向量。 vectorstore Chroma.from_documents( documentsdocument_splits, embeddingembed_model, persist_directorypersist_directory ) # 显式持久化虽然 from_documents 通常会做但显式调用更安全 vectorstore.persist() print(fVectorstore created and persisted to {persist_directory}) return vectorstore # 执行 if __name__ __main__: splits load_and_split_documents() vs create_vectorstore(splits)运行这个脚本后会在./chroma_db目录下生成向量数据库文件。第一次运行会耗时较长因为要计算所有文本块的嵌入向量。之后启动应用可以直接加载这个目录速度很快。3.3 第三步组装检索与生成链这是 LangChain 发挥威力的地方。我们使用LCELLangChain Expression Language来声明式地组合链条。# 文件chain.py from langchain.chains import create_retrieval_chain from langchain.chains.combine_documents import create_stuff_documents_chain from langchain_core.prompts import ChatPromptTemplate from config import llm # 导入前面定义的 LLM def create_rag_chain(retriever): # 1. 定义系统提示词这是指导模型如何回答的关键 system_prompt ( 你是一个专业的金融知识问答助手。请严格根据以下提供的上下文信息来回答问题。\n 如果上下文中的信息不足以回答问题请直接说“根据已知信息无法回答该问题”不要编造信息。\n 回答请保持专业、简洁、清晰。\n\n 上下文\n{context} ) # 2. 构建提示词模板 prompt ChatPromptTemplate.from_messages([ (system, system_prompt), (human, {input}), ]) # 3. 创建“文档整合链”负责将检索到的文档和问题格式化后送给 LLM document_chain create_stuff_documents_chain(llm, prompt) # 4. 创建“检索链”将检索器和文档整合链连接起来 rag_chain create_retrieval_chain(retriever, document_chain) return rag_chain提示词工程要点系统提示词system_prompt必须清晰指令模型“基于上下文回答”。{context}和{input}是占位符LangChain 会自动填充。你可以根据金融场景调整语气例如要求“引用具体条款编号”、“用列表形式说明风险点”等。3.4 第四步创建 FastAPI 服务并提供问答接口现在我们把链条包装成一个 Web 服务。# 文件main.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from langchain_chroma import Chroma from chain import create_rag_chain from config import embed_model import uvicorn app FastAPI(title金融知识问答机器人 API) # 数据模型定义请求和响应的结构 class QueryRequest(BaseModel): question: str class QueryResponse(BaseModel): answer: str # 后续可以扩展返回引用的来源等 # 启动时加载向量数据库和链 app.on_event(startup) async def startup_event(): global rag_chain print(Loading vectorstore and creating chain...) vectorstore Chroma( persist_directory./chroma_db, embedding_functionembed_model ) # 创建检索器可以设置 top_k返回最相关的几个文档块 retriever vectorstore.as_retriever(search_kwargs{k: 4}) rag_chain create_rag_chain(retriever) print(Service started and ready for queries.) app.post(/query, response_modelQueryResponse) async def query_knowledge_base(request: QueryRequest): try: # 调用链。invoke 方法接收一个字典键需与链的输入变量名匹配。 # 我们的链需要 input 和 context但 context 由检索器自动提供。 result rag_chain.invoke({input: request.question}) answer result.get(answer, 未能生成答案。) return QueryResponse(answeranswer) except Exception as e: raise HTTPException(status_code500, detailf处理请求时出错: {str(e)}) if __name__ __main__: uvicorn.run(app, host0.0.0.0, port8000)启动服务python main.py现在你可以通过http://localhost:8000/docs访问自动生成的 API 文档并通过/query接口发送问题。4. 进阶优化与生产环境考量一个能跑通的 Demo 和一个稳定的生产服务之间还有很长的路要走。以下是几个关键的优化方向。4.1 检索质量优化不仅仅是向量搜索基础的向量检索可能不够。对于金融问答准确性至关重要。混合检索结合向量检索语义相似和关键词检索如 BM25。LangChain 支持EnsembleRetriever。重排序向量检索返回 top_k 个结果后用一个更精细的模型如bge-reranker对它们重新排序把最相关的排在最前面。元数据过滤在存入向量库时为每个文本块添加元数据如“文档类型年报”、“章节风险提示”。检索时可以要求只检索特定类型的文档。# 创建带元数据的检索器 retriever vectorstore.as_retriever( search_kwargs{k: 6, “filter”: {“doc_type”: “annual_report”}} )4.2 引入对话记忆Memory让机器人记住之前的对话内容。LangChain 提供了多种 Memory 后端。from langchain.memory import ConversationBufferMemory from langchain.chains import ConversationalRetrievalChain memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue, output_keyanswer) # 使用专门用于对话检索的链 qa_chain ConversationalRetrievalChain.from_llm( llmllm, retrieverretriever, memorymemory, combine_docs_chain_kwargs{prompt: prompt} # 使用之前定义的prompt ) # 调用时链会自动管理历史记录 result qa_chain.invoke({question: “我们公司去年的净利润是多少”}) # 下一个问题可以指代上文 result2 qa_chain.invoke({question: “同比增长了呢”})注意记忆会占用 LLM 的上下文窗口。对于长对话需要使用ConversationSummaryMemory或ConversationBufferWindowMemory来限制长度。4.3 构建复杂工作流LangGraph 的用武之地如果我们的机器人不只是问答还需要执行多步骤任务比如“分析A公司年报总结其三大财务风险并和B公司去年同期数据做个对比”这就需要工作流编排。这就是LangGraph的领域。LangGraph 允许你以“图”的形式定义状态和节点节点可以是 LLM 调用、工具执行或条件判断。虽然本项目基础版用不上但了解其能力边界很重要。当你的智能体需要反复调用工具、进行循环或分支判断时就该考虑 LangGraph 了。4.4 性能、监控与部署缓存对频繁的相似查询结果进行缓存可以极大减少 LLM 调用和检索开销。LangChain 集成Redis、SQLite等作为缓存后端。异步处理对于耗时的文档处理或 LLM 调用使用异步async/await避免阻塞。FastAPI 天然支持。日志与监控记录每一次问答的请求、响应、检索到的文档、token 消耗和耗时。这对于分析效果、优化成本和排查问题至关重要。部署使用Docker容器化你的应用。对于生产 API考虑用Nginx做反向代理用Gunicorn配合 Uvicorn worker来运行 FastAPI以提高并发能力。5. 常见问题排查与调试心得在实际开发中你肯定会遇到各种问题。以下是我总结的排查优先级问题答案胡编乱造不依据上下文。先看检索调用链时把retriever.get_relevant_documents(question)的结果打印出来。看看检索到的文本块是否真的与问题相关。如果不相关调整chunk_size或优化嵌入模型。再看提示词检查你的system_prompt是否足够强硬地要求模型“基于上下文”。可以加上“如果上下文没有明确提及请说不知道”。最后看 LLM换一个更“听话”的模型试试或者调整 LLM 的温度参数temperature调低如 0.1可以使输出更确定、更遵循指令。问题服务响应慢。定位瓶颈分别给文档加载/分割、向量化、检索、LLM 调用几个阶段打点计时。向量化慢考虑使用更快的嵌入模型或者将嵌入向量预先计算好存入数据库而不是实时计算。LLM 调用慢如果是 API检查网络如果是本地模型考虑量化、使用更快的推理引擎如 vLLM或升级硬件。问题处理长文档时出错或丢失信息。检查分割RecursiveCharacterTextSplitter可能因为分隔符设置不当而切碎表格或代码块。对于特定格式可能需要自定义分割器。上下文长度确保chunk_size 问题长度 提示词长度 LLM 的上下文窗口。同时检索返回的多个 chunk 的总长度也不能超限。问题依赖包版本冲突。LangChain 生态依赖较多这是最常见的问题。务必使用虚拟环境并记录下所有包的版本pip freeze requirements.txt。遇到问题时优先查看 LangChain 和其集成包的官方文档和 GitHub issue。最后一点心得LangChain 降低了开发门槛但并不意味着你不需要理解其背后的原理。花时间理解Chain、Agent、Tool、Memory这些核心抽象比死记硬背代码更有用。当出现问题时从最简单的链条开始测试例如先测试 LLM 是否能正常对话再测试检索器是否能返回正确文档逐步叠加复杂度这样能最快定位问题所在。这个基于 LangChain 的金融问答机器人项目从技术验证到生产部署还有很多细节需要打磨比如安全、权限、更复杂的业务逻辑集成等。但通过以上步骤你已经掌握了用 LangChain 构建一个可用 AI 应用的核心路径。剩下的就是在具体业务场景中不断迭代和优化了。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度