LangChain实战:从零构建具备RAG与Agent能力的智能助手

发布时间:2026/7/21 10:22:35
LangChain实战:从零构建具备RAG与Agent能力的智能助手 这次我们来看一个 LangChain 项目实战教程。LangChain 作为当前构建大语言模型应用的主流框架其核心价值在于将复杂的 AI 能力封装成可组合的模块让开发者能快速搭建起具备记忆、工具调用和知识检索能力的智能体。对于想入门 AI 应用开发尤其是想亲手实现一个能联网搜索、能查文档、能进行多轮对话的智能体的朋友这篇文章可以直接收藏。本文的重点不是复述 LangChain 的复杂概念而是提供一个能快速跑通的实战项目。我们会从零开始搭建一个具备 RAG 知识库和 Agent 智能体能力的应用。整个过程会重点关注环境搭建的坑点、关键组件的配置、以及如何验证每个环节是否工作正常。无论你是想学习 LangChain 的初学者还是希望将 AI 能力集成到现有系统的开发者都能通过本文的步骤获得一个可运行的起点。我们将围绕一个具体的项目目标展开构建一个能回答特定领域问题的智能助手。这个助手不仅能理解你的问题还能自动决定是去联网搜索最新信息还是从我们预先构建好的本地知识库中查找答案最后组织成连贯的回复。下面我们就直接进入实战环节。1. 核心能力速览在开始动手之前我们先快速了解通过本次实战你将获得的核心能力以及大致的资源门槛。能力项说明项目类型基于 LangChain 的 AI 智能体与 RAG 应用核心功能1.RAG 知识库上传本地文档如 PDF、TXT构建向量数据库实现基于知识的问答。2.Agent 智能体集成工具调用如联网搜索让 LLM 自主决策使用何种工具回答问题。3.对话记忆维护多轮对话上下文使助手具备连贯的对话能力。技术栈LangChain, OpenAI API (或兼容的本地模型), ChromaDB (向量数据库), LangChain Community Tools硬件门槛本项目主要调用云端 LLM API如 OpenAI GPT对本地 GPU 无硬性要求。若使用本地部署的 LLM如 Ollama则需根据模型大小准备相应显存。启动方式通过 Python 脚本启动提供命令行交互界面或简单的 Web 界面。是否支持 API是可轻松封装为 FastAPI 等 Web 服务提供 HTTP API。是否支持批量任务是RAG 知识库构建阶段支持批量文档导入与处理。适合场景个人学习 LangChain、快速构建领域知识问答原型、开发具备工具调用能力的 AI 助手 Demo。2. 适用场景与使用边界在投入开发前明确工具的适用边界能避免后期走弯路。这个项目适合谁AI 应用初学者希望通过一个完整项目理解 LangChain 的核心概念Model I/O, Chains, Agents, Memory。全栈/后端开发者需要快速集成 AI 能力到现有产品寻找可复用的代码范式。业务分析师或产品经理希望低成本验证“AI专业知识”场景的可行性构建概念验证原型。能解决什么问题静态知识问答将公司产品手册、技术文档、规章制度等转化为可问答的知识库员工可通过自然语言快速查询。动态信息整合对于需要结合实时信息如天气、股价、新闻的问题智能体可以自动调用搜索工具获取最新数据再回答。多步骤任务自动化例如用户说“帮我总结一下最近三天关于 AI 芯片的新闻”智能体可规划“搜索 - 获取链接 - 抓取内容 - 总结”的步骤并执行。不适合什么场景超高频或生产级并发原型项目的代码结构和数据库选型可能未考虑高并发优化。对回答准确性要求极高RAG 的检索质量受文本分割、向量化模型影响可能出现检索不全或幻觉需要精细调优。完全离线环境如果使用 OpenAI GPT 等云端 API需要网络。若需完全离线需替换为本地模型如通过 Ollama这会增加部署复杂度。版权、隐私与安全边界文档版权仅为本地构建知识库的文档请确保你拥有合法使用权或文档是公开的。API 密钥安全使用的 OpenAI API Key 或其他 LLM 服务密钥需妥善保管不要提交到公开代码仓库。数据隐私上传的文档内容会发送给 LLM 服务商如 OpenAI进行处理请勿上传敏感或机密数据。考虑使用可本地部署的模型以保障数据隐私。工具调用风险联网搜索等功能可能访问任意网页需注意潜在的网络请求安全与内容过滤问题。3. 环境准备与前置条件我们将在一个干净的 Python 环境中进行以下是详细的准备清单。1. 操作系统支持 Windows (建议 WSL2)、macOS 和 Linux。本文以 Windows 11 WSL2 (Ubuntu 22.04) 或 macOS 为例。2. Python 环境推荐使用 Python 3.10 或 3.11兼容性最好。避免使用 Python 3.12某些依赖包可能尚未完全适配。使用conda或venv创建独立的虚拟环境是强推荐的做法可以避免包冲突。3. 关键依赖概览LangChain核心框架。LangChain Community包含许多社区维护的工具和集成。OpenAI用于调用 GPT 系列模型。ChromaDB轻量级、内存友好的向量数据库用于存储和检索文档向量。TiktokenOpenAI 模型的快速分词器。Python-dotenv管理环境变量如 API Key。其他文档加载器如PyPDF2(PDF),Unstructured(多种格式)根据你的文档类型安装。4. 网络与 API 访问确保你的网络环境可以稳定访问api.openai.com如果你使用 OpenAI 模型。准备一个有效的OpenAI API Key。你也可以使用其他兼容 OpenAI API 的本地或云端服务只需相应调整base_url和api_key。5. 磁盘空间预留几百 MB 空间用于安装 Python 包。向量数据库和缓存的文档嵌入向量会占用额外空间取决于文档数量。4. 安装部署与启动方式我们从一个最精简的项目结构开始一步步安装依赖并启动一个具备基础对话能力的智能体。第一步创建项目目录与虚拟环境打开终端执行以下命令# 创建项目目录并进入 mkdir langchain-agent-rag-demo cd langchain-agent-rag-demo # 创建虚拟环境 (以 venv 为例) python -m venv venv # 激活虚拟环境 # Windows (PowerShell) .\venv\Scripts\Activate.ps1 # macOS/Linux source venv/bin/activate # 激活后命令行提示符前应显示 (venv)第二步安装核心依赖创建一个requirements.txt文件内容如下langchain0.1.0 langchain-community0.0.10 langchain-openai0.0.2 chromadb0.4.18 tiktoken python-dotenv openai1.6.0 # 以下文档加载器按需安装 pypdf3.17.0 # 用于PDF unstructured[pdf] # 功能更强的文档解析然后安装pip install -r requirements.txt如果安装unstructured遇到问题可以先跳过用pypdf处理 PDF 基本够用。第三步配置环境变量在项目根目录创建.env文件用于安全存储 API Key# .env 文件内容 OPENAI_API_KEY你的实际OpenAI_API_KEY # 例如OPENAI_API_KEYsk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx第四步编写第一个可运行的智能体脚本创建一个名为basic_agent.py的文件实现一个能调用搜索引擎的简单智能体# basic_agent.py import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_react_agent from langchain.tools import Tool from langchain_community.tools import DuckDuckGoSearchRun from langchain import hub # 1. 加载环境变量 load_dotenv() # 2. 初始化大语言模型 llm ChatOpenAI( modelgpt-3.5-turbo, # 或 gpt-4 temperature0, openai_api_keyos.getenv(OPENAI_API_KEY) ) # 3. 定义工具 search DuckDuckGoSearchRun() tools [ Tool( nameSearch, funcsearch.run, descriptionUseful for when you need to answer questions about current events or latest information. Input should be a search query. ) ] # 4. 获取ReAct提示词模板 prompt hub.pull(hwchase17/react) # 5. 创建智能体 agent create_react_agent(llm, tools, prompt) # 6. 创建执行器 agent_executor AgentExecutor( agentagent, toolstools, verboseTrue, # 开启详细日志看到思考过程 handle_parsing_errorsTrue # 优雅处理解析错误 ) # 7. 运行测试 if __name__ __main__: print(智能体已启动输入 quit 退出。) while True: user_input input(\n你的问题: ) if user_input.lower() quit: break try: response agent_executor.invoke({input: user_input}) print(f\n助手: {response[output]}) except Exception as e: print(f执行出错: {e})第五步启动并测试在终端中运行这个脚本python basic_agent.py如果一切正常你会看到提示符。尝试问一个需要最新信息的问题例如“今天北京天气怎么样”。观察verboseTrue输出的日志你会看到类似Thought:、Action:、Observation:的步骤这就是智能体在“思考”并决定使用搜索工具的过程。如果成功你将获得一个基于网络搜索的答案。至此一个最基本的 LangChain 智能体已经跑通。接下来我们为其增加 RAG 知识库能力。5. 功能测试与效果验证现在我们为核心智能体添加 RAG 功能构建一个既能查本地知识库又能联网搜索的“混合”助手。5.1 构建 RAG 知识库首先准备一些本地文档如data/目录下的 PDF 或 TXT 文件。然后创建build_rag.py脚本# build_rag.py import os from dotenv import load_dotenv from langchain_openai import OpenAIEmbeddings from langchain_community.document_loaders import PyPDFLoader, TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.vectorstores import Chroma load_dotenv() # 1. 配置嵌入模型 embeddings OpenAIEmbeddings( modeltext-embedding-3-small, # 性价比高的嵌入模型 openai_api_keyos.getenv(OPENAI_API_KEY) ) # 2. 加载文档 (示例加载一个PDF) loader PyPDFLoader(./data/your_document.pdf) # 请替换为你的文件路径 documents loader.load() # 3. 分割文本 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, # 每个块的大小 chunk_overlap200, # 块之间的重叠 length_functionlen, separators[\n\n, \n, , ] ) chunks text_splitter.split_documents(documents) print(f将文档切分为 {len(chunks)} 个文本块。) # 4. 创建向量数据库并持久化 vectorstore Chroma.from_documents( documentschunks, embeddingembeddings, persist_directory./chroma_db # 向量数据库保存路径 ) vectorstore.persist() print(向量数据库已构建并保存至 ./chroma_db)运行此脚本以构建知识库python build_rag.py成功后会生成chroma_db文件夹里面存储了文档片段的向量。5.2 创建 RAG 检索工具接下来创建一个工具让智能体能够查询这个本地知识库。创建rag_tool.py# rag_tool.py import os from dotenv import load_dotenv from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma from langchain.tools import Tool load_dotenv() def setup_rag_tool(): 初始化RAG检索工具 embeddings OpenAIEmbeddings( modeltext-embedding-3-small, openai_api_keyos.getenv(OPENAI_API_KEY) ) # 加载已构建的向量数据库 vectorstore Chroma( persist_directory./chroma_db, embedding_functionembeddings ) # 将检索器包装成一个函数 def retrieve_from_knowledgebase(query: str) - str: 从知识库中检索与问题相关的文档片段。 docs vectorstore.similarity_search(query, k3) # 返回最相关的3个片段 content \n\n.join([doc.page_content for doc in docs]) return f以下是从知识库中检索到的相关信息\n{content} # 创建 LangChain Tool 对象 rag_tool Tool( nameKnowledgeBase, funcretrieve_from_knowledgebase, descriptionUseful for when you need to answer questions about the specific domain knowledge stored in the local documents. Input should be a clear question. ) return rag_tool5.3 集成 RAG 工具与搜索工具的智能体现在我们将 RAG 工具和搜索工具结合起来创建一个功能更强大的智能体。创建hybrid_agent.py# hybrid_agent.py import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_react_agent from langchain import hub from rag_tool import setup_rag_tool from langchain_community.tools import DuckDuckGoSearchRun load_dotenv() # 1. 初始化LLM llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 2. 准备工具列表 search_tool DuckDuckGoSearchRun() rag_tool setup_rag_tool() tools [ Tool( nameSearch, funcsearch_tool.run, descriptionUseful for when you need to answer questions about current events, real-time data, or general world knowledge. Input should be a search query. ), rag_tool # 使用我们刚创建的RAG工具 ] # 3. 获取提示词模板并创建智能体 prompt hub.pull(hwchase17/react) agent create_react_agent(llm, tools, prompt) agent_executor AgentExecutor( agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue, max_iterations5 # 限制最大迭代次数防止死循环 ) # 4. 测试函数 def test_hybrid_agent(): print( 混合智能体测试开始 ) test_queries [ What is the capital of France?, # 通用知识可能用搜索 根据我们本地文档项目的主要目标是什么, # 特定知识应用RAG 今天特斯拉的股价是多少, # 实时信息应用搜索 文档里提到的关键技术挑战有哪些, # 特定知识应用RAG ] for query in test_queries: print(f\n[用户问题]: {query}) try: result agent_executor.invoke({input: query}) print(f[助手回答]: {result[output]}) print(- * 50) except Exception as e: print(f[执行错误]: {e}) if __name__ __main__: test_hybrid_agent() # 也可以像之前一样运行交互式循环 # while True: ...运行与验证确保chroma_db目录已存在即已运行过build_rag.py。运行混合智能体python hybrid_agent.py。观察日志重点关注verbose日志。当问及本地文档内容时智能体应选择KnowledgeBase工具。当问及实时或通用知识时智能体应选择Search工具。你可以看到Thought: I should use the KnowledgeBase tool to find...这样的决策过程。成功标准智能体能正确区分问题类型调用不同的工具。对于知识库问题能返回基于你上传文档内容的答案。对于搜索问题能返回网络获取的最新信息。整个流程无报错并能完成多轮对话如果实现循环。6. 接口 API 与批量任务一个原型除了命令行交互提供 API 接口才能更方便地集成到其他系统。同时构建知识库本身就是一个典型的批量任务。6.1 使用 FastAPI 封装智能体为 Web API安装 FastAPI 和 Uvicornpip install fastapi uvicorn创建app.py# app.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import Optional import os from dotenv import load_dotenv from hybrid_agent import agent_executor # 导入我们之前创建的智能体执行器 load_dotenv() app FastAPI(titleLangChain Hybrid Agent API) class QueryRequest(BaseModel): question: str conversation_id: Optional[str] None # 可用于支持多会话 class QueryResponse(BaseModel): answer: str source: str # 标明答案来源knowledge_base, search, 或 combined app.post(/query, response_modelQueryResponse) async def query_agent(request: QueryRequest): 向混合智能体提问。 try: result agent_executor.invoke({input: request.question}) # 简单判断来源实际可根据agent执行日志更精确判断 answer result[output] source combined # 这里简化处理实际项目可以解析执行轨迹 return QueryResponse(answeranswer, sourcesource) except Exception as e: raise HTTPException(status_code500, detailfAgent execution failed: {str(e)}) app.get(/health) async def health_check(): return {status: healthy} if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8000)启动 API 服务python app.py服务启动后访问http://127.0.0.1:8000/docs可以看到自动生成的 API 文档。使用 curl 测试 APIcurl -X POST http://127.0.0.1:8000/query \ -H Content-Type: application/json \ -d {question: What is LangChain?}6.2 批量文档处理与知识库更新在实际应用中知识库需要定期更新。我们可以编写一个脚本批量处理一个目录下的所有文档。创建batch_process_docs.py# batch_process_docs.py import os from glob import glob from langchain_community.document_loaders import ( PyPDFLoader, TextLoader, UnstructuredFileLoader ) from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma from dotenv import load_dotenv load_dotenv() def get_loader(file_path): 根据文件后缀返回对应的加载器 if file_path.endswith(.pdf): return PyPDFLoader(file_path) elif file_path.endswith(.txt): return TextLoader(file_path, encodingutf-8) else: # 使用Unstructured作为兜底支持更多格式 return UnstructuredFileLoader(file_path) def batch_build_knowledgebase(data_dir./data, persist_dir./chroma_db): 批量处理目录下的所有文档重建向量数据库。 all_docs [] # 支持的文件格式 supported_extensions [*.pdf, *.txt, *.md, *.docx] file_paths [] for ext in supported_extensions: file_paths.extend(glob(os.path.join(data_dir, ext))) if not file_paths: print(f在目录 {data_dir} 下未找到支持格式的文档。) return print(f找到 {len(file_paths)} 个文档开始加载...) for fp in file_paths: try: loader get_loader(fp) docs loader.load() all_docs.extend(docs) print(f 已加载: {os.path.basename(fp)} ({len(docs)} 页/段)) except Exception as e: print(f 加载失败 {fp}: {e}) # 分割文本 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, chunk_overlap200 ) chunks text_splitter.split_documents(all_docs) print(f文本分割完成共得到 {len(chunks)} 个文本块。) # 创建或更新向量数据库 embeddings OpenAIEmbeddings(modeltext-embedding-3-small) # 注意这会覆盖已有的 chroma_db vectorstore Chroma.from_documents( documentschunks, embeddingembeddings, persist_directorypersist_dir ) vectorstore.persist() print(f向量数据库已更新并保存至 {persist_dir}。) if __name__ __main__: # 你可以修改数据目录和输出目录 batch_build_knowledgebase(data_dir./my_docs, persist_dir./my_knowledge_db)使用方式将你的文档放入my_docs文件夹。运行python batch_process_docs.py。脚本会自动识别格式、加载、分割并生成新的向量数据库。最佳实践建议将批量处理脚本设置为定时任务如 Cron以实现知识库的定期自动更新。在处理大量文档时考虑加入进度条和错误重试机制。对于生产环境可以考虑使用更健壮的向量数据库如 PGVector基于 PostgreSQL或 Qdrant。7. 资源占用与性能观察虽然本项目主要依赖云端 LLM但本地运行的部分如文档处理、向量检索仍有性能考量点。1. 向量数据库性能内存占用ChromaDB 在默认情况下会将向量索引加载到内存中以加速检索。文档块和向量越多内存占用越高。对于大型知识库如数万文档块建议监控内存使用。检索速度检索速度与向量维度如text-embedding-3-small是 1536 维和索引数量有关。通常千级别文档块的检索在毫秒到百毫秒内完成。2. 网络延迟与 API 成本LLM API 调用这是最主要的延迟和成本来源。gpt-3.5-turbo比gpt-4快且便宜但能力稍弱。每个问题都可能触发多次 LLM 调用Agent 的每一步思考都是一次调用。嵌入 API 调用构建知识库时每个文本块都需要调用嵌入模型 API 生成向量。这是一次性成本但文档量大时费用可观。text-embedding-3-small是目前性价比最高的选择。3. 本地计算资源CPU/内存文档加载、文本分割、以及运行 FastAPI 服务器会消耗 CPU 和内存。对于轻量级使用普通配置即可。磁盘 I/O频繁读取文档或向量数据库文件可能成为瓶颈建议使用 SSD。优化建议缓存对常见问题的答案或中间检索结果进行缓存可以显著减少 LLM 调用。限制 Agent 迭代次数通过max_iterations参数如前文设置为 5防止智能体陷入无限循环。优化文本分割chunk_size和chunk_overlap影响检索精度和上下文完整性需要根据文档特点调整。异步处理对于 API 服务可以使用异步框架如FastAPI本身支持来处理并发请求避免阻塞。8. 常见问题与排查方法在部署和运行过程中你可能会遇到以下问题。这里提供快速排查思路。问题现象可能原因排查方式解决方案导入 LangChain 模块失败1. 未安装对应包。2. 包版本冲突。3. 虚拟环境未激活。1. 检查pip list确认langchain,langchain-community等是否存在。2. 查看错误信息是否提示缺少某个子模块。1. 重新安装指定版本pip install langchain0.1.0。2. 在全新的虚拟环境中安装。运行时报错OpenAI API key not provided1..env文件未创建或路径不对。2. API Key 格式错误或已失效。3. 代码中未正确加载环境变量。1. 确认.env文件在项目根目录且内容为OPENAI_API_KEYsk-...。2. 在代码开头打印os.getenv(‘OPENAI_API_KEY’)的前几位检查是否加载成功。1. 确保python-dotenv已安装并在代码最开头调用load_dotenv()。2. 直接在代码中临时写死 API Key 进行测试测试后务必删除。智能体不调用工具直接回答“我不知道”1. 工具描述 (description) 不够清晰LLM 无法理解何时使用。2. 提示词 (prompt) 不适合。3. LLM 温度 (temperature) 过高导致输出随机。1. 检查verboseTrue的日志看Thought步骤中是否在评估工具。2. 尝试简化工具描述使其更直白。1. 重写工具描述明确使用场景例如“当问题涉及[你的领域]内部知识时使用此工具”。2. 尝试不同的提示词模板如hub.pull(“hwchase17/react-chat”)。3. 将temperature设为 0。RAG 检索结果不相关1. 文本分割策略不佳破坏了语义完整性。2. 嵌入模型不适合你的领域。3. 检索数量k太小。1. 检查分割后的文本块看是否在句子中间被切断。2. 尝试不同的chunk_size(如 500, 800) 和chunk_overlap。3. 换用其他嵌入模型如text-embedding-3-large。1. 使用RecursiveCharacterTextSplitter并调整separators参数。2. 增加k值如从 3 到 5让 LLM 有更多上下文。3. 在检索后加入“重排序”步骤提升精度。向量数据库加载失败1.persist_directory路径错误或目录不存在。2. 嵌入模型与构建时不一致。1. 检查./chroma_db目录是否存在且包含chroma.sqlite3等文件。2. 确认构建和加载时使用的嵌入模型名称完全相同。1. 使用绝对路径避免歧义。2. 确保构建 (from_documents) 和加载 (Chroma) 时使用相同的embedding_function。API 服务启动后无法访问1. 端口被占用。2. 防火墙或安全组限制。3. 服务绑定到127.0.0.1而非0.0.0.0。1. 使用 netstat -anofindstr :8000(Win) 或lsof -i:8000(Mac/Linux) 检查端口。br2. 尝试用curl http://127.0.0.1:8000/health 本地测试。批量处理文档时内存溢出1. 单个文档过大。2. 一次性加载所有文档到内存。1. 监控任务管理器的内存使用情况。2. 尝试先处理一个小文档测试。1. 实现流式或分批次处理文档而不是一次性加载全部。2. 对于超大 PDF考虑先按页分割再处理。9. 最佳实践与使用建议基于以上实践总结出以下几点建议帮助你更稳健地使用和扩展本项目。1. 项目结构规范化建议将代码模块化例如your_project/ ├── app.py # FastAPI 主应用 ├── agents/ │ ├── __init__.py │ ├── hybrid_agent.py # 智能体构建逻辑 │ └── tools/ # 工具定义 │ ├── __init__.py │ ├── rag_tool.py │ └── search_tool.py ├── knowledge_base/ │ ├── __init__.py │ ├── builder.py # 知识库构建脚本 │ └── retriever.py # 检索器封装 ├── data/ # 原始文档 ├── chroma_db/ # 向量数据库由脚本生成 ├── .env # 环境变量 ├── requirements.txt └── README.md2. 配置外部化将所有可配置参数如模型名称、温度、chunk_size、API Base URL放入配置文件如config.yaml或环境变量避免硬编码。3. 日志与监控为关键步骤如工具调用、LLM 请求、检索操作添加详细日志。记录每个用户会话的完整Agent执行轨迹便于调试和优化。监控 API 调用次数和费用。4. 错误处理与降级为网络请求LLM、搜索设置合理的超时和重试机制。当某个工具如搜索失败时智能体应有降级策略如仅依赖知识库回答或直接告知用户暂时无法获取实时信息。5. 安全与合规输入检查对用户输入进行基本的清理和过滤防止 Prompt 注入攻击。输出审查对于公开服务考虑对模型输出进行内容安全过滤。数据留存明确日志和用户数据的留存策略遵守相关法律法规。6. 从原型到生产向量数据库考虑将 ChromaDB 替换为支持持久化和集群的数据库如Qdrant、Weaviate或PGVector。缓存层引入Redis缓存频繁查询的检索结果或最终答案。异步化使用langchain的异步接口和异步 Web 框架提升并发能力。评估与迭代建立简单的评估流程定期用一批标准问题测试系统回答质量持续优化提示词和检索策略。10. 总结与下一步通过这个实战项目我们完成了一个具备 RAG 知识库和 Agent 智能体能力的 LangChain 应用从零到一的搭建。最值得尝试的点在于你能清晰地看到 LLM 如何通过 LangChain 提供的框架协调不同的工具搜索、检索来完成一个复杂任务。这比直接调用 Chat API 提供了强大得多的可控性和扩展性。最先应该验证的功能基础 Agent 流程运行basic_agent.py确认智能体能正确调用搜索工具回答实时问题。RAG 检索准确性构建一个小型知识库问几个文档中明确包含答案的问题看智能体是否能通过KnowledgeBase工具找到并回答。混合决策能力运行hybrid_agent.py分别提问需要搜索和需要知识库的问题观察智能体是否能正确选择工具。最容易踩的坑环境变量未加载这是最常见的问题务必确认.env文件格式正确且load_dotenv()在代码最开头调用。版本兼容性LangChain 版本迭代较快注意社区工具 (langchain-community) 的导入方式可能与旧版本不同。工具描述不清智能体“犯傻”很多时候是因为工具描述 (description) 没写明白导致 LLM 无法理解何时该调用它。用自然语言清晰定义工具的用途和输入格式。后续扩展方向集成更多工具尝试接入计算器、数据库查询、邮件发送等工具打造更强大的智能体。优化检索质量实验不同的文本分割策略、尝试重排序模型、或用MultiQueryRetriever生成多个问题来提升召回率。实现记忆管理使用ConversationBufferWindowMemory或ConversationSummaryMemory让智能体记住更长的对话历史。尝试本地模型使用Ollama本地运行Llama 3、Qwen等模型替代 OpenAI API实现完全离线部署。部署上线使用 Docker 容器化应用并部署到云服务器或容器平台。这个项目代码是一个坚实的起点你可以基于它快速实验自己的想法。建议将代码保存好在需要构建 AI 应用原型时这套模板能为你节省大量前期搭建的时间。