LangChain实战:从零构建Agent智能体与RAG知识库应用
这次我们来看一个面向2026年的LangChain实战教程。如果你正在寻找一个能快速上手、直接跑通Agent智能体和RAG项目的学习路径这篇文章就是为你准备的。LangChain作为大语言模型应用开发的事实标准框架其核心价值在于将复杂的LLM集成、工具调用、记忆管理和知识检索流程标准化。但很多教程停留在概念层面导致开发者看完还是不知道如何从零搭建一个可用的智能体系统。本文的重点不是复述官方文档而是提供一个能立即动手的实战指南。我们将直接切入LangChain的核心组件通过一个完整的AgentRAG项目带你完成环境搭建、代码编写、功能测试和效果验证的全过程。你会看到如何用LangChain连接本地或云端的LLM如何让Agent使用工具比如搜索、计算、文件操作以及如何构建一个能回答特定领域问题的RAG知识库应用。整个过程强调可操作性代码可直接复用帮你避开初期最常见的依赖、版本和配置陷阱。1. 核心能力速览在深入代码之前我们先快速了解基于LangChain构建应用的核心能力和技术门槛。这能帮你判断这个技术栈是否适合你的项目。能力项说明与评估项目类型大语言模型应用开发框架用于构建Agent、RAG、链式应用等。核心功能智能体Agent让LLM具备使用工具搜索、API、代码执行的能力。检索增强生成RAG从外部知识库检索信息结合LLM生成更准确的回答。链Chain将多个LLM调用或工具按顺序组合成复杂工作流。记忆Memory在对话或多步推理中保持状态和历史。硬件/环境门槛开发环境主要依赖Python环境。对本地GPU无硬性要求因为LLM可以调用云端API如OpenAI、通义千问、DeepSeek等。本地部署如需本地运行开源模型如Qwen、Llama则需要相应的GPU资源显存要求取决于模型大小7B模型约需14GB以上显存。本文以调用云端API为主降低入门门槛。启动与运行通过Python脚本或Jupyter Notebook启动无WebUI一键包。核心是编写和运行Python代码。接口能力LangChain本身提供的是编程接口Python SDK。你可以基于它快速开发出提供HTTP API的Web服务如使用FastAPI。批量任务支持原生支持可通过Python循环、异步或集成任务队列如Celery轻松处理批量文档处理、批量问答等。适合场景1.企业知识库问答基于内部文档构建RAG系统。2.自动化助手开发能调用工具完成特定任务的AI Agent。3.复杂工作流编排将多个LLM步骤和数据处理步骤串联起来。4.快速原型验证快速验证LLM在特定业务场景下的可行性。2. 适用场景与使用边界LangChain是一个强大的“胶水”框架但它并非万能。明确其适用边界能帮助你更有效地进行技术选型。它最适合谁全栈/后端开发者希望将LLM能力快速集成到现有系统或新产品中。AI应用创业者需要快速构建基于LLM的智能应用原型或MVP。数据分析师/研究员希望用标准化方式构建复杂的文本分析或研究辅助流水线。学生与学习者想要体系化地学习LLM应用开发的最佳实践。它能解决什么问题工具调用抽象你不用再手动编写复杂的提示词来让LLM理解如何调用工具LangChain提供了标准化的Tool接口和Agent执行器。知识检索集成轻松将向量数据库如Chroma、Milvus、Pinecone与LLM结合实现RAG。它处理了文档加载、切分、向量化、检索和上下文组装的繁琐流程。流程标准化将“提示词模板 - 调用LLM - 解析输出 - 执行下一步”的模式抽象成Chain和Runnable使代码更模块化、可维护。多模型支持一套代码通过更换配置即可对接OpenAI、Anthropic、国内大模型、甚至本地部署的Ollama模型降低了供应商锁定风险。它不适合什么场景超轻量级、单次提示词调用如果你只是简单调用一次API直接使用requests库或模型的官方SDK可能更直接。对延迟和成本极度敏感的生产环境LangChain的抽象层会带来轻微开销。在极端优化场景下可能需要直接使用底层API或自定义更轻量的框架。非Python技术栈LangChain的核心生态在Python。虽然有其JS/TS版本但成熟度和社区资源远不及Python版。合规与安全边界数据隐私使用云端LLM API时你的提示词和检索到的知识可能会发送到第三方服务器。处理敏感数据时务必确认服务商的隐私协议或考虑使用可本地部署的开源模型。知识版权RAG系统中使用的文档需确保你有合法的使用权。生成的回答可能包含受版权保护内容的衍生内容需注意合规风险。Agent工具安全赋予Agent执行代码、操作文件、调用网络API的权限时必须设置严格的沙箱环境和权限控制防止恶意操作。3. 环境准备与前置条件让我们开始搭建实战环境。以下清单列出了开始前需要准备的所有内容。1. 基础软件环境操作系统Windows 10/11, macOS, 或 Linux (Ubuntu 20.04 推荐)。本文命令以Linux/macOS为例Windows用户可在PowerShell或WSL中运行。Python版本Python 3.10 或 3.11。这是与大多数AI库兼容性最好的版本。避免使用Python 3.12可能遇到某些依赖尚未适配。包管理工具使用pip或更推荐的conda/mamba来创建独立的虚拟环境避免依赖冲突。2. 核心依赖安装我们将创建一个新的虚拟环境并安装LangChain及其常用组件。# 1. 创建并激活虚拟环境 (使用conda示例) conda create -n langchain-demo python3.10 -y conda activate langchain-demo # 2. 升级pip pip install --upgrade pip # 3. 安装LangChain核心包 pip install langchain langchain-core # 4. 安装LangChain社区包包含大量第三方集成 pip install langchain-community # 5. 安装用于连接OpenAI API的包如果你使用OpenAI pip install openai # 6. 安装用于RAG的文档加载和向量库集成包 pip install chromadb langchain-chroma tiktoken pypdf # 7. 安装用于Agent的工具包示例如数学计算、网络搜索 pip install langchain-experimental # 包含一些实验性功能如Plan-and-execute Agent pip install duckduckgo-search # 用于网络搜索工具3. LLM访问权限云端API你需要一个可用的LLM API密钥。例如OpenAI 获取OPENAI_API_KEY。通义千问 获取DASHSCOPE_API_KEY。DeepSeek 获取DEEPSEEK_API_KEY。其他Anthropic, Google Gemini等。本地模型如果你打算在本地运行需要安装ollama并拉取模型或者部署vLLM/Transformers等推理框架。这需要足够的GPU资源。4. 代码编辑器或IDE推荐使用VS Code、PyCharm或Cursor它们对Python和Jupyter Notebook有良好支持。4. 安装验证与第一个链环境准备好后我们写一个最简单的脚本验证安装是否成功并运行第一个LangChain链。步骤1设置API密钥在终端中临时设置环境变量或在代码中直接配置仅为演示生产环境应使用环境变量或密钥管理服务。# 在终端中设置Linux/macOS export OPENAI_API_KEYyour-openai-api-key-here # 在终端中设置Windows PowerShell $env:OPENAI_API_KEYyour-openai-api-key-here步骤2创建验证脚本创建一个名为first_chain.py的文件。# first_chain.py import os from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser # 1. 初始化LLM # 使用gpt-3.5-turbo模型温度设为0.7创造性适中 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0.7) # 2. 创建提示词模板 prompt_template ChatPromptTemplate.from_messages([ (system, 你是一个乐于助人的助手。), (user, {input}) ]) # 3. 创建输出解析器将AI响应解析为字符串 output_parser StrOutputParser() # 4. 构建链Prompt - LLM - Parser chain prompt_template | llm | output_parser # 5. 调用链 if __name__ __main__: # 测试输入 user_input 用一句话解释什么是LangChain。 response chain.invoke({input: user_input}) print(问题, user_input) print(回答, response)步骤3运行脚本在激活的虚拟环境中运行该脚本。python first_chain.py预期输出与成功判断如果一切正常你将看到类似以下的输出问题 用一句话解释什么是LangChain。 回答 LangChain是一个用于开发由语言模型驱动的应用程序的框架它通过提供模块化组件和链式调用简化了构建复杂AI应用的过程。这证明你的LangChain环境、OpenAI连接和基础链式调用都是正常的。如果遇到错误请检查API密钥是否正确设置且有效。网络连接是否能访问OpenAI API。依赖包是否完整安装可运行pip list | grep langchain查看。5. 构建一个具备工具调用能力的智能体Agent智能体是LangChain最吸引人的功能之一。它让LLM能够主动使用工具来获取信息或执行操作。我们将构建一个能进行数学计算和网络搜索的简单智能体。项目目标创建一个Agent当用户问及需要实时信息或复杂计算的问题时它能自动选择并使用正确的工具。步骤1定义工具我们创建两个工具一个用于计算使用Python的eval生产环境请慎用或使用安全计算库一个用于搜索使用DuckDuckGo。# agent_tools.py from langchain.tools import Tool from langchain_community.tools import DuckDuckGoSearchRun import math # 工具1数学计算工具 def calculate(expression: str) - str: 计算一个数学表达式。例如3 * 5 2 try: # 警告在生产环境中应对表达式进行严格的安全检查避免代码注入。 # 这里使用一个受限的命名空间来增强安全性。 allowed_names {k: v for k, v in math.__dict__.items() if not k.startswith(_)} allowed_names.update({abs: abs, round: round}) result eval(expression, {__builtins__: {}}, allowed_names) return str(result) except Exception as e: return f计算错误{e} math_tool Tool( nameCalculator, funccalculate, description用于计算数学表达式。输入应该是一个有效的数学表达式字符串如 3 * 5 2 或 sqrt(16)。 ) # 工具2网络搜索工具 search_tool DuckDuckGoSearchRun(nameWebSearch) # 工具列表 tools [math_tool, search_tool]步骤2创建智能体执行器我们将使用LangChain的“ReAct”代理框架它鼓励LLM进行“思考Reason”和“行动Act”。# agent_executor.py import os from langchain_openai import ChatOpenAI from langchain.agents import create_react_agent, AgentExecutor from langchain_core.prompts import PromptTemplate from agent_tools import tools # 导入上面定义的工具 # 1. 初始化更强大的LLM如gpt-4-turbo或gpt-3.5-turbo llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 2. ReAct代理的提示词模板 react_prompt PromptTemplate.from_template( 你是一个智能助手可以访问以下工具 {tools} 使用以下格式回答 问题你需要回答的输入问题 思考你应该始终进行思考。如果需要使用工具请在这里分析。 行动要执行的动作应该是[{tool_names}]中的一个。 行动输入该动作的输入 观察动作的结果 ... (这个思考/行动/观察的循环可以重复多次) 思考我现在知道最终答案了 最终答案对原始问题的最终回答 开始 问题{input} {agent_scratchpad} ) # 3. 创建代理 agent create_react_agent(llm, tools, react_prompt) # 4. 创建代理执行器 agent_executor AgentExecutor(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue) # 5. 测试代理 if __name__ __main__: questions [ 计算圆周率乘以10的平方结果保留两位小数。, 搜索一下今天北京的最高温度是多少, 先计算15的阶乘是多少然后告诉我人工智能最近一周有什么重要新闻。 ] for q in questions: print(f\n{*50}) print(f问题{q}) print(f{*50}) try: result agent_executor.invoke({input: q}) print(f最终答案{result[output]}) except Exception as e: print(f执行出错{e})步骤3运行并观察运行python agent_executor.py。你将看到详细的执行过程因为设置了verboseTrue 问题计算圆周率乘以10的平方结果保留两位小数。 进入新的代理执行链... 思考用户要求计算圆周率乘以10的平方。我需要使用计算器工具。 行动Calculator 行动输入pi * 10 ** 2 观察314.1592653589793 思考现在需要将结果保留两位小数。 行动Calculator 行动输入round(314.1592653589793, 2) 观察314.16 思考我现在知道最终答案了。 最终答案圆周率乘以10的平方结果保留两位小数是314.16。效果验证与排查成功标志Agent正确识别问题类型选择了Calculator工具并给出了计算步骤和最终答案。搜索工具对于需要实时信息的问题Agent应选择WebSearch工具。注意DuckDuckGo搜索可能受网络环境影响返回内容格式不一。常见问题工具选择错误提示词可能不够清晰可以尝试优化Tool的description字段使其更精确。解析错误如果LLM的输出不符合ReAct格式会抛出OutputParserException。设置handle_parsing_errorsTrue可以让执行器尝试修复。API超时或限流复杂问题可能导致多轮工具调用增加延迟和Token消耗。需监控API使用情况。6. 构建一个本地知识库问答系统RAG实战RAG是让LLM回答特定领域问题的关键技术。我们将构建一个简单的系统加载本地PDF文档将其内容向量化并存入向量数据库然后实现基于内容的问答。项目目标创建一个能回答关于“LangChain官方文档”内容的问答系统。步骤1准备知识文档在项目目录下创建一个docs/文件夹并放入一些PDF或TXT格式的文档。例如你可以从LangChain官网下载几页教程PDF或自己创建几个关于LangChain介绍的文本文件。步骤2实现RAG全流程创建一个名为rag_system.py的文件。# rag_system.py import os from pathlib import Path from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain_community.document_loaders import PyPDFLoader, TextLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_chroma import Chroma from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnablePassthrough from langchain_core.output_parsers import StrOutputParser class SimpleRAGSystem: def __init__(self, persist_directory./chroma_db, embedding_modeltext-embedding-3-small): 初始化RAG系统。 :param persist_directory: 向量数据库持久化目录 :param embedding_model: 嵌入模型名称 self.persist_directory persist_directory # 初始化嵌入模型用于将文本转换为向量 self.embeddings OpenAIEmbeddings(modelembedding_model) # 初始化LLM用于生成答案 self.llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 向量数据库客户端 self.vectorstore None # RAG链 self.rag_chain None def load_and_split_documents(self, docs_path: str): 加载指定目录下的所有文档并进行切分 documents [] path Path(docs_path) # 支持.pdf和.txt文件 for file_path in path.glob(*): if file_path.suffix.lower() .pdf: loader PyPDFLoader(str(file_path)) elif file_path.suffix.lower() .txt: loader TextLoader(str(file_path)) else: continue documents.extend(loader.load()) print(f已加载: {file_path.name}) # 文本切分器将长文档切分成适合检索的小块 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, # 每个块约1000字符 chunk_overlap200, # 块之间重叠200字符保持上下文连贯 length_functionlen, separators[\n\n, \n, 。, , , , , , ] ) splits text_splitter.split_documents(documents) print(f文档切分完成共得到 {len(splits)} 个文本块。) return splits def create_vectorstore(self, splits): 创建或加载向量数据库 # 如果持久化目录已存在则直接加载 if os.path.exists(self.persist_directory) and os.listdir(self.persist_directory): print(f从 {self.persist_directory} 加载已有向量数据库...) self.vectorstore Chroma( persist_directoryself.persist_directory, embedding_functionself.embeddings ) else: print(创建新的向量数据库...) self.vectorstore Chroma.from_documents( documentssplits, embeddingself.embeddings, persist_directoryself.persist_directory ) self.vectorstore.persist() # 持久化到磁盘 print(向量数据库就绪。) return self.vectorstore def build_rag_chain(self, k4): 构建RAG问答链 if not self.vectorstore: raise ValueError(请先创建或加载向量数据库。) # 检索器从向量库中查找最相关的k个文本块 retriever self.vectorstore.as_retriever(search_kwargs{k: k}) # 提示词模板将问题和检索到的上下文组合起来 template 你是一个专业的问答助手请严格根据以下上下文来回答问题。 如果你不知道答案就诚实地回答不知道不要编造信息。 上下文 {context} 问题{question} 请根据上下文给出答案 prompt ChatPromptTemplate.from_template(template) # 构建链检索 - 格式化上下文 - 生成答案 self.rag_chain ( {context: retriever, question: RunnablePassthrough()} | prompt | self.llm | StrOutputParser() ) print(RAG问答链构建完成。) return self.rag_chain def ask(self, question: str): 向RAG系统提问 if not self.rag_chain: raise ValueError(请先构建RAG链。) return self.rag_chain.invoke(question) def clear_database(self): 清空向量数据库谨慎操作 import shutil if os.path.exists(self.persist_directory): shutil.rmtree(self.persist_directory) print(f已清空向量数据库目录: {self.persist_directory}) self.vectorstore None self.rag_chain None if __name__ __main__: # 初始化系统 rag_system SimpleRAGSystem() # 第一步加载并处理文档首次运行或文档更新时执行 # splits rag_system.load_and_split_documents(./docs) # vectorstore rag_system.create_vectorstore(splits) # 第二步构建RAG链如果数据库已存在直接构建 try: rag_system.build_rag_chain(k4) except ValueError: print(未找到向量数据库请先执行文档加载步骤。) # 取消下面两行的注释以执行完整的初始化流程 # splits rag_system.load_and_split_documents(./docs) # vectorstore rag_system.create_vectorstore(splits) # rag_system.build_rag_chain(k4) # 第三步进行问答测试 test_questions [ LangChain是什么, Chain在LangChain中代表什么, 如何安装LangChain, ] for q in test_questions: print(f\n问题{q}) answer rag_system.ask(q) print(f答案{answer}) print(- * 40)步骤3运行与效果验证首次运行取消脚本中注释掉的三行代码加载文档、创建向量库、构建链然后运行。程序会读取./docs下的文档进行切分、向量化并存储到./chroma_db目录。后续运行注释掉文档加载部分直接运行。程序会从已有的./chroma_db加载向量库速度更快。观察输出系统会基于你提供的文档内容生成答案。如果文档中没有相关信息LLM应回答“不知道”。成功判断与问题排查成功标志系统能返回基于文档内容的、准确的答案而不是通用或编造的信息。检索质量如果答案不相关可能是检索的文本块k值太少或太多或者文本切分不合理chunk_size和chunk_overlap需要调整。嵌入模型确保使用的嵌入模型如text-embedding-3-small与你的OpenAI账户兼容。Token限制检索到的上下文总长度不能超过LLM的上下文窗口。gpt-3.5-turbo约4096个Token需控制chunk_size和k的乘积。7. 将智能体与RAG结合一个更强大的助手现在我们将前面两部分结合起来创建一个更强大的智能体它既能使用工具计算、搜索又能查询我们构建的本地知识库。项目目标创建一个混合智能体当问题涉及我们的专有知识LangChain文档时优先使用RAG当需要实时信息或计算时使用工具。步骤1将RAG系统封装成工具我们修改之前的SimpleRAGSystem类使其ask方法可以作为LangChain的一个Tool被调用。# hybrid_agent.py from langchain.tools import Tool from rag_system import SimpleRAGSystem # 导入之前写的RAG系统 # 初始化RAG系统假设向量数据库已存在 rag_system SimpleRAGSystem() try: rag_system.build_rag_chain(k4) except ValueError: print(警告RAG系统未初始化知识库工具将不可用。) # 将RAG系统的问答功能封装成一个工具 def query_knowledge_base(question: str) - str: 查询LangChain知识库。输入应该是一个关于LangChain的问题。 try: answer rag_system.ask(question) return answer except Exception as e: return f查询知识库时出错{e} knowledge_tool Tool( nameLangChainKnowledgeBase, funcquery_knowledge_base, description用于回答关于LangChain框架的特定问题。输入应该是一个明确的问题。 ) # 复用之前的数学计算和搜索工具 from agent_tools import math_tool, search_tool # 组合所有工具 all_tools [knowledge_tool, math_tool, search_tool]步骤2创建混合智能体执行器我们使用一个更简单的代理类型——create_openai_tools_agent它专为OpenAI的Function Calling优化。# hybrid_agent.py (续) from langchain_openai import ChatOpenAI from langchain.agents import create_openai_tools_agent, AgentExecutor from langchain_core.prompts import ChatPromptTemplate # 初始化LLM llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 系统提示词指导Agent优先使用知识库 system_prompt 你是一个强大的助手拥有以下能力 1. 访问一个专门的LangChain知识库工具LangChainKnowledgeBase。当用户询问关于LangChain的概念、安装、使用等问题时**必须优先使用此工具**。 2. 进行数学计算工具Calculator。 3. 搜索最新的网络信息工具WebSearch。 请根据问题类型智能地选择最合适的工具。如果问题与LangChain无关则不要使用知识库工具。 prompt ChatPromptTemplate.from_messages([ (system, system_prompt), (user, {input}), (assistant, {agent_scratchpad}), ]) # 创建代理 agent create_openai_tools_agent(llm, all_tools, prompt) # 创建执行器 agent_executor AgentExecutor(agentagent, toolsall_tools, verboseTrue, handle_parsing_errorsTrue) # 测试 if __name__ __main__: test_queries [ LangChain中的Chain是什么概念, # 应使用知识库 计算一下2的10次方是多少, # 应使用计算器 今天天气怎么样, # 应使用网络搜索 帮我总结一下LangChain的主要组件。 # 应使用知识库 ] for query in test_queries: print(f\n{*60}) print(f[用户问题]{query}) print(f{*60}) result agent_executor.invoke({input: query}) print(f[最终答案]{result[output]})步骤3运行与观察运行python hybrid_agent.py。观察verbose日志看Agent是如何决策的对于LangChain相关问题它应该调用LangChainKnowledgeBase工具。对于计算问题调用Calculator。对于实时信息调用WebSearch。效果验证工具选择正确性这是混合Agent成功的关键。系统提示词和工具描述description的清晰度直接影响LLM的选择。答案质量知识库工具返回的答案应比通用LLM回答更精准、更具专业性。失败处理当知识库工具无法回答时例如问题超出文档范围Agent应能优雅地回退到其他工具或直接承认不知道。8. 资源占用、性能观察与优化建议虽然本文主要使用云端API但了解资源占用和性能优化对构建稳定应用至关重要。1. API调用成本与延迟观察Token消耗使用OpenAI等按Token计费的API时需监控输入和输出的Token数量。RAG中检索到的上下文会显著增加输入Token。优化优化chunk_size只检索最相关的片段对长答案进行摘要。延迟Agent的多轮工具调用和RAG的检索生成都会增加整体响应时间。优化对检索器使用缓存如CacheBackedEmbeddings对常见问题预生成答案。2. 本地部署时的资源考量如果你选择本地部署开源模型如通过Ollama显存占用7B参数模型通常需要14GB以上GPU显存进行全参数推理。使用量化技术如GGUF, GPTQ可将需求降至6-8GB。内存与磁盘模型文件本身占用磁盘空间7B模型约4-7GB。加载模型需要相应内存。性能本地推理速度远慢于云端API尤其是在没有GPU或GPU性能较弱的情况下。3. 向量数据库性能检索速度ChromaDB在小型数据集上内存检索很快。当文档超过百万级时需考虑Milvus、Pinecone等分布式向量数据库。持久化定期持久化向量数据库避免数据丢失。对于生产环境应考虑数据库的备份和高可用方案。4. 代理执行优化超时与重试为工具调用和LLM调用设置超时和重试机制提高系统鲁棒性。限制轮次通过max_iterations或max_execution_time限制Agent的最大思考轮次防止陷入死循环。9. 常见问题与排查方法在开发过程中你可能会遇到以下典型问题。问题现象可能原因排查方式解决方案导入LangChain模块失败(ModuleNotFoundError)1. 未安装对应包。2. 虚拟环境未激活。3. 包版本冲突。1.pip list | grep langchain查看已安装包。2. 检查当前Python解释器路径。1. 使用pip install langchain-community等命令安装缺失包。2. 确认并激活正确的虚拟环境。3. 创建全新的虚拟环境重新安装。OpenAI API调用失败(AuthenticationError,RateLimitError)1. API密钥错误或未设置。2. 账户余额不足或达到速率限制。3. 网络问题。1. 检查环境变量OPENAI_API_KEY。2. 登录OpenAI平台查看用量和限额。3. 使用curl测试API连通性。1. 设置正确的API密钥。2. 充值或等待限额重置。3. 检查代理或防火墙设置。Agent一直循环不输出答案1. 提示词导致LLM无法做出最终决策。2. 工具描述不清晰LLM无法正确选择。3.max_iterations设置过高。查看verboseTrue的日志观察Agent的“思考”和“行动”输出是否陷入循环。1. 优化系统提示词明确给出停止条件。2. 精简并精确化工具描述。3. 设置合理的max_iterations如10。RAG系统返回无关答案或“不知道”1. 检索到的文本块不相关。2. 嵌入模型不适合该领域文本。3. 提示词模板未强制要求基于上下文。1. 检查检索器返回的原文块是否与问题相关。2. 尝试不同的chunk_size和chunk_overlap。3. 查看发送给LLM的完整提示词。1. 优化文本切分策略尝试更小的chunk_size。2. 尝试不同的嵌入模型。3. 强化提示词中的指令如“必须严格基于上下文”。向量数据库检索速度慢1. 文档数量巨大未使用索引。2. 每次启动都重新计算嵌入。1. 检查向量库中文档数量。2. 确认是否使用了持久化目录。1. 对于大数据集考虑使用带索引的向量数据库如Milvus。2. 确保嵌入模型和向量库被复用而不是每次新建。工具调用出错如计算器1. 输入给工具的格式不正确。2. 工具函数内部有Bug。查看Agent执行日志中“行动输入”的内容并手动测试工具函数。1. 在工具描述中明确输入格式示例。2. 在工具函数内部增加输入验证和错误处理。10. 最佳实践与下一步方向基于以上实战这里有一些总结性建议和可以继续探索的方向。最佳实践从简单开始先用一个LLM、一个提示词完成核心功能再逐步添加Agent、RAG、记忆等复杂组件。模块化设计将工具、链、代理分别定义在独立的模块或类中提高代码可读性和可测试性。配置化管理将模型名称、API密钥、温度、块大小等参数放在配置文件如config.yaml或环境变量中便于不同环境部署。日志与监控为关键步骤LLM调用、工具调用、检索添加详细日志便于调试和性能分析。考虑集成像LangSmith这样的追踪平台。错误处理与降级为LLM调用、工具调用设置重试和超时。设计降级策略例如当RAG检索失败时直接让LLM基于其通用知识回答。安全第一对于执行代码、访问文件或调用外部API的工具实施严格的输入验证和权限控制。避免在提示词中泄露API密钥等敏感信息。下一步可以做什么集成更多工具让Agent可以发送邮件、读写数据库、调用企业内部API真正成为自动化助手。实现对话记忆使用ConversationBufferMemory或ConversationSummaryMemory让Agent在多轮对话中记住历史。尝试不同的Agent框架除了ReAct还可以尝试Plan-and-Execute代理适用于复杂多步骤任务或OpenAI Functions Agent与OpenAI的Function Calling深度集成。优化RAG流程重排序Re-ranking在初步检索后使用一个更精细的模型对结果重排序提升Top1答案的相关性。混合检索结合关键词检索如BM25和向量检索取长补短。父文档检索检索时返回小片段但在生成答案时将其对应的更大父文档作为上下文避免信息割裂。部署为Web服务使用FastAPI或Gradio将你的智能体或RAG系统封装成HTTP API或Web界面方便团队使用。探索LangGraph对于需要复杂状态管理和循环的工作流可以学习LangGraph它用图的方式编排链和代理功能更强大。这个实战指南为你提供了一个从零到一的LangChain应用开发路径。核心在于理解其组件化思想用Chain组织流程用Agent调度工具用RAG接入知识。剩下的就是根据你的具体业务需求将这些模块像乐高一样组合起来。建议将本文的代码作为起点不断修改、实验和扩展直到构建出真正解决你问题的AI应用。