在构建基于大语言模型的应用时你是否遇到过这样的困境模型知识陈旧无法回答最新的业务问题或者模型“一本正经地胡说八道”给出的答案缺乏事实依据这些问题正是当前AI应用落地的核心痛点。本文将围绕LangChain这一强大的AI应用开发框架为你提供一套从零到一的实战指南。我们将不仅快速入门LangChain的核心概念更会深入Agent智能体与RAG检索增强生成这两个最热门的技术方向通过一个完整的项目实战带你构建一个能够利用外部知识、自主决策的智能应用。无论你是希望快速上手的新手还是寻求项目落地的进阶开发者都能从本文中找到清晰的路径和可复用的代码。1. LangChain、Agent与RAG核心概念解析在深入代码之前我们有必要厘清这三个核心概念及其相互关系这是构建稳健应用的基石。1.1 LangChainAI应用的“脚手架”LangChain不是一个具体的模型而是一个框架。你可以把它想象成构建AI应用的“脚手架”或“工具箱”。它的核心价值在于将大语言模型LLM与外部数据源、工具、记忆系统等连接起来构建成功能复杂的应用链Chain。它主要解决了什么问题集成复杂性标准化了与不同LLM如OpenAI GPT、 Anthropic Claude、本地模型的交互接口。上下文管理帮助处理超出模型单次对话限制的长文本通过多种策略进行分割、总结和保留。工具调用让LLM能够使用外部工具如计算器、搜索引擎、数据库扩展其能力边界。应用流程编排通过“链”Chain的概念将多个步骤提示词模板、模型调用、输出解析组合成可预测的工作流。简单说没有LangChain你也能直接调用API但需要自己处理大量胶水代码有了LangChain你可以更专注于业务逻辑。1.2 Agent智能体赋予模型“行动力”如果说普通的LLM调用是“你问我答”那么Agent就是让模型学会“思考-行动-观察”的循环。Agent的核心是一个决策引擎它让LLM能够根据目标、当前状态和可用工具自主决定下一步该做什么。关键组件LLMAgent的“大脑”负责思考和决策。工具ToolsAgent可以调用的函数如搜索、查询数据库、执行代码等。代理类型AgentType定义了Agent的决策逻辑。例如ZERO_SHOT_REACT_DESCRIPTION最常用的一种基于ReAct框架让模型推理Reason后行动Act。OPENAI_FUNCTIONS专为支持函数调用的GPT模型设计。记忆Memory让Agent记住之前的交互历史。一个典型的Agent工作流程是用户提问 - AgentLLM思考需要用什么工具 - 调用工具并获取结果 - 根据结果再次思考或给出最终答案。1.3 RAG检索增强生成为模型注入“新鲜知识”RAG是解决LLM知识滞后和幻觉问题的关键技术。其核心思想是在让模型生成答案前先从外部知识库如文档、数据库中检索出相关的信息片段然后将这些片段和原始问题一起作为上下文提供给模型让模型基于此生成答案。RAG流程分为两大步检索Retrieval将用户问题转化为查询从向量数据库中找出最相关的文本块。增强生成Augmented Generation将检索到的文本块作为额外上下文与问题一并提交给LLM生成最终答案。为什么需要向量数据库因为传统的数据库无法高效处理“语义相似度”查询。向量数据库将文本转换为高维向量嵌入通过计算向量间的距离如余弦相似度来找到语义上最接近的文本。LangChain在RAG中的作用它提供了完整的工具链包括文档加载、文本分割、向量化、存储到向量数据库、检索以及最终生成答案的链式编排。2. 环境准备与项目初始化我们将构建一个“技术文档智能问答助手”作为实战项目。它能够读取你的技术文档如Markdown、PDF并回答基于文档内容的问题。2.1 环境与版本说明操作系统Windows 10/11, macOS, 或 Linux (Ubuntu 22.04)。本文命令以Linux/macOS为例Windows用户可在PowerShell或WSL中运行。Python版本 3.8。推荐使用3.9或3.10以获得最佳兼容性。包管理使用pip。强烈建议使用虚拟环境venv或conda。核心依赖版本2024年初稳定版本langchain0.1.0LangChain核心库。注意LangChain版本迭代快API可能有变本文代码基于0.1.x版本。langchain-community0.0.10社区贡献的组件集成。langchain-openai0.0.2OpenAI模型集成。openai1.0.0OpenAI官方Python SDK。chromadb0.4.18轻量级向量数据库用于存储和检索文档向量。tiktoken用于OpenAI模型的文本分词。python-dotenv管理环境变量。2.2 创建项目并安装依赖首先创建项目目录并初始化虚拟环境。# 创建项目目录 mkdir langchain-rag-agent-demo cd langchain-rag-agent-demo # 创建虚拟环境 (Python 3.9) python -m venv venv # 激活虚拟环境 # Linux/macOS: source venv/bin/activate # Windows: # venv\Scripts\activate # 升级pip pip install --upgrade pip接下来创建requirements.txt文件并安装依赖。# requirements.txt langchain0.1.0 langchain-community0.0.10 langchain-openai0.0.2 openai1.0.0 chromadb0.4.18 tiktoken python-dotenv pypdf # 用于读取PDF文档 markdown # 用于解析Markdown安装依赖pip install -r requirements.txt2.3 配置API密钥本项目使用OpenAI的模型你需要一个OpenAI API密钥。将其保存在项目根目录的.env文件中切勿上传至代码仓库。# .env OPENAI_API_KEY你的OpenAI_API密钥 # 可选如果你使用其他模型或需要代理 # OPENAI_API_BASEhttps://api.openai.com/v1在代码中使用dotenv加载密钥。# config.py import os from dotenv import load_dotenv load_dotenv() # 加载 .env 文件中的环境变量 OPENAI_API_KEY os.getenv(OPENAI_API_KEY) if not OPENAI_API_KEY: raise ValueError(请在 .env 文件中设置 OPENAI_API_KEY)3. LangChain核心模块快速入门在开始项目前我们先快速过一遍LangChain的几个最常用模块并编写简单的测试代码。3.1 模型I/O与LLM对话的基础这是最直接的交互层包括提示词模板、模型调用和输出解析。# quick_start.py from langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain.schema.output_parser import StrOutputParser from config import OPENAI_API_KEY # 1. 初始化模型 llm ChatOpenAI( modelgpt-3.5-turbo, temperature0, # 控制随机性0表示更确定性的输出 openai_api_keyOPENAI_API_KEY ) # 2. 创建提示词模板 prompt_template ChatPromptTemplate.from_messages([ (system, 你是一个专业的软件工程师助手。), (user, {input}) ]) # 3. 创建链模板 - 模型 - 输出解析器 chain prompt_template | llm | StrOutputParser() # 4. 调用链 response chain.invoke({input: 用Python写一个快速排序函数。}) print(模型回答, response)运行python quick_start.py你将看到模型生成的代码。这里引入了|运算符这是LangChain新版本0.1.x推荐的LCELLangChain Expression Language语法用于声明式地组合链非常直观。3.2 检索构建知识库的基石RAG的核心在于检索。我们演示如何加载本地文档并存入向量数据库。# retrieval_demo.py from langchain_community.document_loaders import TextLoader, PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma from config import OPENAI_API_KEY import os # 1. 加载文档 (假设有一个 example.txt 文件) loader TextLoader(example.txt, encodingutf-8) # 或 PyPDFLoader(example.pdf) documents loader.load() print(f加载了 {len(documents)} 个文档) # 2. 分割文本 text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每个文本块的大小 chunk_overlap50, # 块之间的重叠保持上下文连贯 separators[\n\n, \n, 。, , , , , 、, , ] ) split_docs text_splitter.split_documents(documents) print(f分割为 {len(split_docs)} 个文本块) # 3. 嵌入模型 向量数据库 embeddings OpenAIEmbeddings(openai_api_keyOPENAI_API_KEY) # 持久化存储到本地目录 ./chroma_db vectorstore Chroma.from_documents( documentssplit_docs, embeddingembeddings, persist_directory./chroma_db ) print(文档已向量化并存储到 Chroma 数据库。) # 4. 测试检索 query 文档中提到了什么关键技术 retrieved_docs vectorstore.similarity_search(query, k2) # 检索最相似的2个块 for i, doc in enumerate(retrieved_docs): print(f\n--- 检索结果 {i1} ---) print(doc.page_content[:200]) # 打印前200个字符3.3 智能体Agent初体验让我们创建一个能使用简单工具如计算、搜索网络的Agent。# agent_demo.py from langchain.agents import initialize_agent, AgentType from langchain.agents import Tool from langchain_openai import ChatOpenAI from langchain.utilities import WikipediaAPIWrapper, SerpAPIWrapper from config import OPENAI_API_KEY import os # 注意SerpAPI需要单独的API密钥这里仅作演示。你可以先注释掉它。 # 定义工具 def multiplier(a: float, b: float) - float: 两个数相乘。 return a * b tools [ Tool( nameMultiplier, funcmultiplier, description当需要计算两个数的乘积时使用。输入两个数字用逗号分隔。 ), # WikipediaAPIWrapper需要安装 wikipedia 包: pip install wikipedia Tool( nameWikipedia, funcWikipediaAPIWrapper().run, description当需要查询关于人物、地点、公司、历史事件等通用事实时使用。 ), # SerpAPIWrapper需要注册并获取API KEY: https://serpapi.com/ # Tool( # nameSearch, # funcSerpAPIWrapper(serpapi_api_keyos.getenv(SERPAPI_API_KEY)).run, # description当需要搜索最新信息、新闻或无法通过Wikipedia找到答案时使用。 # ), ] # 初始化LLM llm ChatOpenAI(modelgpt-3.5-turbo, temperature0, openai_api_keyOPENAI_API_KEY) # 初始化Agent agent initialize_agent( tools, llm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, # 使用ReAct推理框架 verboseTrue, # 打印Agent的思考过程便于调试 handle_parsing_errorsTrue # 优雅处理解析错误 ) # 运行Agent try: result agent.run(请先计算 12 和 3.5 的乘积然后去维基百科上查一下‘人工智能’这个概念。) print(\n最终答案, result) except Exception as e: print(fAgent执行出错{e})运行此脚本你会看到Agent详细的思考过程verboseTrue它先决定调用Multiplier工具获取结果后再决定调用Wikipedia工具。4. 实战项目技术文档智能问答助手现在我们将综合运用以上知识构建一个完整的RAG系统并为其赋予Agent的能力使其不仅能回答基于文档的问题还能在文档信息不足时决定是否使用网络搜索。4.1 项目结构设计langchain-rag-agent-demo/ ├── .env # 环境变量 ├── config.py # 配置加载 ├── requirements.txt # 依赖 ├── docs/ # 存放你的技术文档PDF, TXT, MD │ ├── api_spec.md │ └── user_guide.pdf ├── chroma_db/ # 向量数据库存储目录自动生成 ├── ingest.py # 文档加载与向量化脚本 ├── rag_chain.py # 基础的RAG问答链 ├── rag_agent.py # 增强版带决策能力的RAG Agent └── main.py # 主交互程序4.2 步骤一文档加载与向量化 (ingest.py)这个脚本负责将docs/目录下的文档处理并存入向量数据库。只需在文档更新后运行一次。# ingest.py import os from langchain_community.document_loaders import ( TextLoader, PyPDFLoader, UnstructuredMarkdownLoader, ) from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma from config import OPENAI_API_KEY # 支持的文件类型 SUPPORTED_EXTENSIONS { .txt: TextLoader, .pdf: PyPDFLoader, .md: UnstructuredMarkdownLoader, } def load_documents_from_dir(directory_path): 从目录加载所有支持格式的文档。 documents [] for root, _, files in os.walk(directory_path): for file in files: file_path os.path.join(root, file) ext os.path.splitext(file)[1].lower() if ext in SUPPORTED_EXTENSIONS: print(f正在加载: {file_path}) try: loader_class SUPPORTED_EXTENSIONS[ext] # 注意不同Loader的初始化参数可能不同这里做简单处理 if loader_class TextLoader: loader loader_class(file_path, encodingutf-8) else: loader loader_class(file_path) loaded_docs loader.load() # 为每个文档添加来源元数据 for doc in loaded_docs: doc.metadata[source] file_path documents.extend(loaded_docs) except Exception as e: print(f加载文件 {file_path} 时出错: {e}) print(f总共加载了 {len(documents)} 个文档。) return documents def main(): docs_dir ./docs persist_dir ./chroma_db # 1. 加载文档 raw_documents load_documents_from_dir(docs_dir) if not raw_documents: print(未找到任何文档请将文档放入 ./docs 目录。) return # 2. 分割文本 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, chunk_overlap200, separators[\n\n, \n, 。, , , , , , ] ) split_documents text_splitter.split_documents(raw_documents) print(f文本分割完成共得到 {len(split_documents)} 个文本块。) # 3. 创建向量存储 embeddings OpenAIEmbeddings(openai_api_keyOPENAI_API_KEY) # 如果已存在数据库可以删除旧库或直接加载。这里我们重新创建。 if os.path.exists(persist_dir): print(f检测到已有向量数据库目录 {persist_dir}正在重新创建...) import shutil shutil.rmtree(persist_dir) vectorstore Chroma.from_documents( documentssplit_documents, embeddingembeddings, persist_directorypersist_dir ) print(f向量化完成数据库已持久化到: {persist_dir}) if __name__ __main__: main()运行python ingest.py将你的文档放入./docs转换为向量知识库。4.3 步骤二构建基础RAG问答链 (rag_chain.py)这是RAG的核心实现检索与生成的管道。# rag_chain.py from langchain_openai import ChatOpenAI, OpenAIEmbeddings from langchain_community.vectorstores import Chroma from langchain.prompts import ChatPromptTemplate from langchain.schema.runnable import RunnablePassthrough from langchain.schema.output_parser import StrOutputParser from config import OPENAI_API_KEY class RAGQASystem: def __init__(self, persist_directory./chroma_db): # 初始化嵌入模型和向量数据库 self.embeddings OpenAIEmbeddings(openai_api_keyOPENAI_API_KEY) self.vectorstore Chroma( persist_directorypersist_directory, embedding_functionself.embeddings ) # 初始化LLM self.llm ChatOpenAI( modelgpt-3.5-turbo, temperature0, openai_api_keyOPENAI_API_KEY ) # 设置检索器 self.retriever self.vectorstore.as_retriever( search_typesimilarity, search_kwargs{k: 4} # 检索最相关的4个文本块 ) # 构建RAG链 self._setup_chain() def _format_docs(self, docs): 将检索到的文档列表格式化为单个上下文字符串。 return \n\n.join([d.page_content for d in docs]) def _setup_chain(self): 组装RAG链。 # 提示词模板指导模型基于上下文回答 template 你是一个技术文档助手请严格根据以下上下文来回答问题。如果上下文没有提供足够信息请直接说“根据提供的文档我无法回答这个问题”不要编造信息。 上下文 {context} 问题{question} 请给出专业、清晰的回答 prompt ChatPromptTemplate.from_template(template) # 使用LCEL组装链输入问题 - 检索 - 格式化 - 提示词 - LLM - 输出解析 self.rag_chain ( {context: self.retriever | self._format_docs, question: RunnablePassthrough()} | prompt | self.llm | StrOutputParser() ) def ask(self, question: str): 提问接口。 return self.rag_chain.invoke(question) if __name__ __main__: # 测试 qa_system RAGQASystem() while True: user_input input(\n请输入你的问题 (输入 quit 退出): ) if user_input.lower() quit: break answer qa_system.ask(user_input) print(f\n助手{answer})4.4 步骤三升级为RAG Agent (rag_agent.py)基础RAG只能回答文档内的问题。我们引入Agent让它能判断问题是否与文档相关如果文档信息不足是否要使用网络搜索# rag_agent.py from langchain.agents import AgentExecutor, create_react_agent from langchain.agents import Tool from langchain.prompts import PromptTemplate from langchain_openai import ChatOpenAI from langchain_community.vectorstores import Chroma from langchain_openai import OpenAIEmbeddings from config import OPENAI_API_KEY import os class RAGAgentSystem: def __init__(self, persist_directory./chroma_db): # 初始化核心组件 self.embeddings OpenAIEmbeddings(openai_api_keyOPENAI_API_KEY) self.vectorstore Chroma( persist_directorypersist_directory, embedding_functionself.embeddings ) self.llm ChatOpenAI(modelgpt-3.5-turbo, temperature0, openai_api_keyOPENAI_API_KEY) self.retriever self.vectorstore.as_retriever(search_kwargs{k: 4}) # 定义工具 self.tools self._define_tools() # 创建Agent self.agent_executor self._create_agent() def _define_tools(self): 定义Agent可用的工具集。 # 工具1文档检索工具 def rag_search(query: str) - str: 当问题与本地技术文档相关时使用此工具。输入是一个明确的问题。 docs self.retriever.get_relevant_documents(query) context \n\n.join([d.page_content for d in docs]) if not context.strip(): return 在知识库中未找到相关信息。 # 这里可以进一步优化比如让一个轻量级LLM先做摘要但为简化直接返回上下文。 return f从知识库中检索到以下相关信息\n{context} # 工具2通用搜索工具示例需要配置API Key # 实际使用时你需要注册SerpAPI或使用其他搜索API def general_search(query: str) - str: 当问题涉及最新动态、新闻或通用知识且文档中找不到时使用。输入是一个搜索查询。 # 此处为模拟返回。真实集成请参考 agent_demo.py 中的 SerpAPIWrapper return f[模拟搜索] 关于 {query} 的当前信息这是一个模拟的搜索结果实际使用时请接入搜索引擎API。 tools [ Tool( nameKnowledgeBase_Search, funcrag_search, description专门用于查询本地技术文档知识库。当用户的问题明显是关于系统功能、API使用、配置说明、错误处理等文档涵盖的内容时优先使用此工具。输入应为清晰的问题。 ), Tool( nameWeb_Search, funcgeneral_search, description用于搜索互联网上的最新信息、新闻、通用技术概念或文档中未涵盖的特定问题。仅在KnowledgeBase_Search工具无法提供答案时使用。输入应为搜索关键词。 ), ] return tools def _create_agent(self): 使用ReAct框架创建Agent。 # ReAct提示词模板 prompt_template 请回答以下问题。你可以使用以下工具 {tools} 请严格按以下格式思考和使用工具 思考我需要先理解问题并决定使用哪个工具。 行动使用的工具名称必须是[{tool_names}]中的一个。 行动输入工具的输入 观察工具返回的结果 ... (这个思考/行动/观察循环可以重复多次) 思考我现在知道了最终答案。 最终答案用中文给出清晰、完整的最终答案。 开始 问题{input} {agent_scratchpad} prompt PromptTemplate.from_template(prompt_template) # 创建React Agent agent create_react_agent(llmself.llm, toolsself.tools, promptprompt) # 创建执行器 agent_executor AgentExecutor( agentagent, toolsself.tools, verboseTrue, # 显示思考过程生产环境可设为False handle_parsing_errorsTrue, max_iterations5, # 限制最大迭代次数防止死循环 early_stopping_methodgenerate ) return agent_executor def ask(self, question: str): 通过Agent提问。 try: result self.agent_executor.invoke({input: question}) return result[output] except Exception as e: return fAgent执行过程中出现错误{e} if __name__ __main__: agent_system RAGAgentSystem() test_questions [ 我们系统的API认证方式是什么, # 应触发知识库搜索 今天OpenAI发布了什么新模型, # 应触发模拟网络搜索 请总结一下用户指南中的核心步骤。, # 应触发知识库搜索 ] for q in test_questions: print(f\n{*50}) print(f问题{q}) print(f{*50}) answer agent_system.ask(q) print(f\n最终答案{answer})4.5 步骤四创建交互式主程序 (main.py)最后我们创建一个简单的命令行交互界面。# main.py from rag_agent import RAGAgentSystem import sys def main(): print(初始化技术文档智能问答助手...) try: qa_system RAGAgentSystem() print(初始化成功你可以开始提问了。输入 quit 或 exit 退出。\n) except Exception as e: print(f初始化失败请检查{e}) print(1. 确保已运行 python ingest.py 创建知识库。) print(2. 确保 .env 文件中配置了正确的 OPENAI_API_KEY。) sys.exit(1) while True: try: user_input input(\n你问).strip() if user_input.lower() in [quit, exit, q]: print(再见) break if not user_input: continue print(\n *60) answer qa_system.ask(user_input) print(*60) print(f\n助手{answer}) except KeyboardInterrupt: print(\n\n程序被中断。) break except Exception as e: print(f\n处理问题时出错{e}) if __name__ __main__: main()现在运行python main.py你就可以与你的智能文档助手对话了。它会自动判断问题类型优先从你的文档中查找答案必要时根据工具描述尝试网络搜索。5. 常见问题与排查思路在开发和运行过程中你可能会遇到以下问题问题现象可能原因解决思路ModuleNotFoundError: No module named langchain_community依赖未正确安装或版本冲突。1. 确认虚拟环境已激活。2. 运行pip install -r requirements.txt --upgrade。3. LangChain 0.1.x 后部分模块被拆分确保安装了langchain-community。openai.AuthenticationErrorOpenAI API密钥错误或未设置。1. 检查.env文件中的OPENAI_API_KEY是否正确。2. 确保在代码中通过load_dotenv()加载了环境变量。3. 检查密钥是否有余额或是否过期。向量数据库检索结果不相关1. 文档分割不合理块太大或太小。2. 嵌入模型不适合。3. 检索参数k设置不当。1. 调整ingest.py中的chunk_size和chunk_overlap。2. 尝试不同的嵌入模型如text-embedding-3-small。3. 调整search_kwargs中的k值或尝试search_typemmr最大边际相关性来增加多样性。Agent陷入循环或调用错误工具1. 工具描述不清晰。2. LLM温度 (temperature) 过高。3. 提示词指令不明确。1. 仔细打磨工具的描述 (description)明确其适用场景。2. 将temperature设为 0 以获得更确定性的决策。3. 在Agent提示词中强化规则例如“必须优先使用知识库工具”。处理中文文档效果差1. 文本分割器切分了中文字符。2. 嵌入模型对中文支持不佳。1. 在RecursiveCharacterTextSplitter的separators中加入中文标点如“。”“”“”。2. 考虑使用支持中文的嵌入模型如text-embedding-3-small对中文支持较好或探索本地化模型。程序运行速度慢1. 网络请求延迟调用OpenAI API。2. 文档分割过多检索慢。3. Agent迭代次数多。1. 考虑使用缓存如langchain.cache。2. 优化chunk_size避免过多碎片。3. 设置max_iterations限制Agent思考步数。6. 最佳实践与进阶优化建议完成基础项目后你可以从以下几个方向进行优化打造更鲁棒、高效的生产级应用。6.1 提升检索质量混合检索结合向量检索语义相似度和关键词检索如BM25兼顾语义和精确匹配。LangChain提供了EnsembleRetriever。重排序初步检索出较多结果如k20后使用一个更精细的模型交叉编码器对结果进行重排序只保留最相关的几个如top-4显著提升精度。元数据过滤在存储文档时添加更多元数据如文档类型、章节、更新时间。检索时可以基于元数据进行过滤例如“只检索用户指南中关于安装的章节”。多索引支持为不同类型的文档建立不同的向量索引根据问题路由到对应的索引进行查询。6.2 优化提示工程系统提示词在提示词中明确角色、任务和格式要求。例如要求模型“如果信息不足请列出已知相关点并指出缺失信息”。少量示例在提示词中提供一两个高质量的问答示例Few-shot Learning引导模型生成更符合预期的格式和风格。分步思考对于复杂问题在提示词中要求模型“逐步推理”这能提高答案的逻辑性。我们使用的ReAct Agent本身就在做这件事。6.3 增强Agent能力自定义工具为你的业务场景开发专用工具。例如QueryDatabaseTool查询业务数据库、ExecuteAPITool调用内部API、SendEmailTool发送邮件通知。记忆管理为Agent添加对话记忆使其能处理多轮对话。可以使用ConversationBufferMemory或更复杂的ConversationSummaryMemory。Agent类型选择根据任务复杂度选择Agent。ZERO_SHOT_REACT_DESCRIPTION通用性强OPENAI_FUNCTIONS与GPT函数调用结合更紧密对于规划复杂任务可以探索PLANNER类型的Agent。6.4 工程化与部署配置管理将模型参数、API密钥、文件路径等抽离到配置文件如config.yaml或环境变量中。日志与监控记录用户的提问、Agent的思考过程、工具调用和最终答案便于调试和优化。监控API调用成本和延迟。异步处理对于Web服务使用异步框架如FastAPI和LangChain的异步接口提高并发处理能力。容器化使用Docker将应用及其依赖包括向量数据库打包确保环境一致性便于部署。6.5 成本与性能考量嵌入模型选择OpenAI的text-embedding-3-small在成本和性能间取得了很好平衡。对于大量文档嵌入成本需重点关注。LLM模型选择根据任务难度权衡gpt-3.5-turbo和gpt-4。简单的信息提取用前者复杂的推理和分析用后者。缓存策略对频繁出现的相似查询结果进行缓存可以大幅减少API调用和延迟。本地模型如果数据隐私要求高或希望控制成本可以考虑使用本地部署的LLM如通过Ollama运行Llama 3和嵌入模型如BGE-M3LangChain同样支持。通过本文的教程你不仅学会了LangChain的快速入门更亲手搭建了一个融合RAG和Agent的智能问答系统。从核心概念理解、环境搭建、模块化编码到项目实战我们覆盖了从入门到进阶的关键路径。记住构建优秀的AI应用是一个迭代过程持续优化检索质量、提示词和工具集你的智能助手将会越来越强大。