如果你正在学习 LangChain大概率会遇到这样的困惑网上教程铺天盖地但要么是零散的代码片段要么是晦涩的概念堆砌。跟着做代码能跑通但一到自己的项目里就不知道如何组装、调试和优化。更让人头疼的是LangChain 版本更新快很多教程已经过时照着做反而会踩坑。这篇文章要解决的正是这个核心痛点如何系统性地、可落地地掌握 LangChain而不是停留在“Hello World”的玩具阶段。我们不会重复那些“什么是 LangChain”的百科式介绍而是直接切入实战用一个贯穿始终的案例带你理解 LangChain 的核心设计思想、关键组件如何协作以及在实际开发中如何避坑。读完本文你将能清晰地回答LangChain 到底解决了什么问题它的核心模块Models, Prompts, Chains, Agents, Memory在项目中各自扮演什么角色如何根据你的需求文档问答、智能客服、数据分析选择合适的架构更重要的是你将获得一套可复用的工程化实践模板能直接应用到你的项目中少走 99% 的弯路。1. LangChain 究竟解决了什么痛点为什么现在必须学在 ChatGPT 出现之前让程序理解并处理自然语言是极其复杂的。你需要处理分词、嵌入、向量检索、意图识别等一系列 NLP 流水线。ChatGPT 等大语言模型LLM的出现将自然语言理解能力变成了一个可通过 API 调用的“通用智能”。但这带来了新的问题LLM 本身是一个“黑盒”它不知道你的私有数据不记得之前的对话也无法直接操作外部工具如数据库、搜索引擎、API。如果你想让 LLM 基于公司内部文档回答问题或者让它帮你分析数据库中的数据你需要写大量的“胶水代码”来连接 LLM、你的数据源和业务逻辑。这就是 LangChain 诞生的背景。它不是一个新模型而是一个框架一个编排工具。它的核心价值在于标准化连接提供了一套统一的接口和组件让你能以声明式的方式连接 LLM、各种数据源文档、数据库、网络和工具计算器、API、代码执行器。抽象复杂流程将常见的 AI 应用模式如问答、摘要、数据提取抽象成可复用的“链”Chains和“智能体”Agents你无需从头设计交互逻辑。管理状态与记忆内置了对话记忆管理机制能轻松实现多轮对话的上下文保持。提升开发与调试效率通过 LangSmith 等可视化工具可以追踪和调试复杂的 AI 调用链这在传统开发中是非常困难的。为什么现在必须学因为 AI 应用开发正在从“演示阶段”进入“生产阶段”。单纯调用 ChatGPT API 写个聊天窗口已经不够了。企业需要的是能处理私有数据、嵌入现有工作流、稳定可靠的 AI 应用。LangChain 是目前生态最成熟、社区最活跃的框架是构建这类生产级 AI 应用的“事实标准”。学习它就是掌握下一代软件开发的必备技能。2. 核心概念拆解不止是“链”更是“乐高积木”很多人把 LangChain 简单理解为“调用 LLM 的链”这是片面的。更准确的比喻是LangChain 是一套精心设计的“乐高积木”。每个积木组件都有标准接口你可以按需拼接构建出从简单到复杂的各种 AI 应用。下面这张表清晰地展示了核心组件及其关系组件核心职责类比在项目中的作用Models提供与大语言模型如 GPT-4、Claude或嵌入模型交互的抽象层。发动机决定 AI 应用的“智力”水平和成本。Prompts管理提示词的模板化、动态化和优化。指令手册将用户输入和上下文数据组装成模型能理解的精确指令直接影响输出质量。Indexes加载、处理、检索外部数据文档、网页、数据库。资料库管理员让 LLM 能够访问并利用你的私有数据是实现“知识增强”的关键。Memory在对话或交互中持久化状态信息。短期记忆实现多轮对话让 AI 记住之前的交流内容。Chains将多个组件模型、提示、工具等按顺序组合成一个可执行的工作流。装配流水线实现固定的、可预测的复杂任务如“读取文档 - 总结 - 生成报告”。Agents让 LLM 自主决定调用哪些工具、以什么顺序来达成目标。自主机器人处理开放性的、需要决策的任务如“帮我分析一下最近的销售数据并给出建议”。关键理解Chain vs Agent这是最容易混淆的点。Chain是确定性的流程像一份写好的剧本每一步都是预设好的。Agent是非确定性的决策者它根据当前情况LLM 的思考动态选择下一步动作。简单任务用Chain复杂、开放任务用Agent。LangChain vs LangGraphLangChain 侧重于线性和相对简单的链式编排。而 LangGraph 是 LangChain 生态中用于构建有状态、可循环、多分支复杂工作流的库更适合需要复杂决策循环的场景如一个支持多次追问和修正的对话系统。对于初学者先掌握 LangChain 的核心链和智能体即可。3. 环境准备搭建一个稳定、可复现的开发环境在开始写代码之前一个隔离、干净的 Python 环境至关重要能避免无数依赖冲突的噩梦。3.1 创建并激活虚拟环境强烈推荐使用conda或venv。# 方法一使用 conda (适合管理多个Python版本和复杂依赖) conda create -n langchain-env python3.10 conda activate langchain-env # 方法二使用 venv (Python标准库轻量) python -m venv langchain-env # Windows langchain-env\Scripts\activate # macOS/Linux source langchain-env/bin/activate激活后命令行提示符前会出现(langchain-env)字样。3.2 安装核心库LangChain 是一个模块化的框架。我们安装最核心的包和常用的社区集成。# 安装 LangChain 核心包 pip install langchain # 安装 OpenAI 集成用于调用 GPT 模型 pip install langchain-openai # 安装用于文档加载和处理的社区工具 pip install langchain-community # 安装向量数据库客户端这里以Chroma为例轻量且易用 pip install chromadb # 安装用于网页内容提取的库 pip install beautifulsoup4 # 安装环境变量管理库用于安全存储API密钥 pip install python-dotenv版本说明LangChain 版本迭代较快本文基于langchain0.1.0的较新版本编写其模块化程度更高。如果你遇到导入错误如from langchain.llms import OpenAI失败很可能是因为你使用的是旧版本0.1.0的语法。新版本中许多集成被移到了独立的langchain-*包中。3.3 配置 API 密钥永远不要将 API 密钥硬编码在代码中使用环境变量。在项目根目录创建.env文件# .env OPENAI_API_KEY你的-openai-api-key-here # 如果你使用其他模型如 Anthropic Claude ANTHROPIC_API_KEY你的-claude-api-key-here在代码中加载# config.py 或主程序开头 from dotenv import load_dotenv import os load_dotenv() # 从 .env 文件加载环境变量 openai_api_key os.getenv(OPENAI_API_KEY) if not openai_api_key: raise ValueError(请在 .env 文件中设置 OPENAI_API_KEY)4. 从零构建一个企业级文档问答系统我们将通过一个完整的项目来串联所有核心概念。场景你有一批公司内部的技术文档PDF、Markdown、TXT你想构建一个系统让员工能用自然语言快速查询这些文档中的信息。4.1 第一步文档加载与分割IndexesLLM 有上下文长度限制不能一次性输入整本书。我们需要将长文档拆分成有意义的“块”。# document_loader.py from langchain_community.document_loaders import TextLoader, PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter import os def load_and_split_documents(directory_path): 加载指定目录下的所有文档并进行智能分割。 documents [] for filename in os.listdir(directory_path): file_path os.path.join(directory_path, filename) if filename.endswith(.pdf): loader PyPDFLoader(file_path) elif filename.endswith(.txt) or filename.endswith(.md): loader TextLoader(file_path, encodingutf-8) else: continue # 跳过不支持的文件类型 loaded_docs loader.load() documents.extend(loaded_docs) # 使用递归字符分割器尽量保持段落和句子的完整性 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, # 每个块的最大字符数 chunk_overlap200, # 块之间的重叠字符避免信息割裂 separators[\n\n, \n, 。, , , , , , ] # 分割优先级 ) split_docs text_splitter.split_documents(documents) print(f原始文档数{len(documents)}分割后块数{len(split_docs)}) return split_docs # 使用示例 if __name__ __main__: docs load_and_split_documents(./your_docs_folder/) # 查看第一个块的内容和元数据 print(docs[0].page_content[:500]) print(f来源{docs[0].metadata})关键点chunk_size需要权衡太小会丢失上下文太大会超出模型限制并增加检索噪音。1000-1500 是常见起点。chunk_overlap至关重要它确保关键信息如一个概念的定义不会恰好被切在两段中间。metadata如来源文件名、页码会被保留用于后续回答的引用溯源。4.2 第二步向量化与存储Indexes Models将文本块转换为向量嵌入并存入向量数据库以便进行相似性搜索。# vector_store.py from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma import os from document_loader import load_and_split_documents def create_vector_store(docs, persist_directory./chroma_db): 创建并持久化向量存储。 # 初始化嵌入模型 # 注意这里会产生 OpenAI API 调用费用 embeddings OpenAIEmbeddings( modeltext-embedding-3-small, # 性价比高的嵌入模型 openai_api_keyos.getenv(OPENAI_API_KEY) ) # 创建向量存储。Chroma 会将向量数据持久化到本地磁盘 vectorstore Chroma.from_documents( documentsdocs, embeddingembeddings, persist_directorypersist_directory ) # 显式持久化某些版本会自动持久化显式调用更安全 vectorstore.persist() print(f向量存储已创建并保存至{persist_directory}) return vectorstore def load_existing_vector_store(persist_directory./chroma_db): 加载已存在的向量存储 embeddings OpenAIEmbeddings(openai_api_keyos.getenv(OPENAI_API_KEY)) vectorstore Chroma( persist_directorypersist_directory, embedding_functionembeddings ) return vectorstore # 主流程首次运行创建后续运行加载 if __name__ __main__: PERSIST_DIR ./chroma_db if not os.path.exists(PERSIST_DIR) or not os.listdir(PERSIST_DIR): print(未检测到已有向量库开始创建...) all_docs load_and_split_documents(./docs/) vectordb create_vector_store(all_docs, PERSIST_DIR) else: print(加载已有向量库...) vectordb load_existing_vector_store(PERSIST_DIR) # 测试检索 test_query 我们公司的请假流程是什么 results vectordb.similarity_search(test_query, k3) # 检索最相似的3个块 for i, doc in enumerate(results): print(f\n--- 结果 {i1} (相关性分数: {doc.metadata.get(score, N/A)}) ---) print(f内容片段{doc.page_content[:300]}...) print(f来源{doc.metadata.get(source, N/A)})核心解释嵌入Embedding将文本转换为高维空间中的向量语义相似的文本其向量距离也近。向量数据库专门为高效存储和检索向量而设计的数据库。Chroma是轻量级单机选择生产环境也可考虑Weaviate、Pinecone云服务等。相似性搜索当用户提问时将问题也转换为向量并在向量库中查找最相似的文本块。这就是“检索增强生成RAG”的“检索”部分。4.3 第三步构建问答链Chains Prompts Models现在我们将检索到的相关文档片段连同用户问题一起构造提示词Prompt发送给 LLM 生成最终答案。# qa_chain.py from langchain_openai import ChatOpenAI from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate from vector_store import load_existing_vector_store def create_qa_chain(): 创建一个基于检索的问答链。 # 1. 加载向量存储 vectordb load_existing_vector_store() # 2. 定义提示词模板 # 这是一个非常关键的步骤好的提示词能极大提升答案质量。 prompt_template 请根据以下上下文信息来回答问题。如果你无法从上下文中找到答案请诚实地回答“我不知道”不要编造信息。 上下文信息 {context} 问题{question} 请基于上下文提供准确、简洁的答案。如果答案涉及步骤或列表请清晰地列出来。 答案 PROMPT PromptTemplate( templateprompt_template, input_variables[context, question] ) # 3. 初始化 LLM # 注意ChatOpenAI 用于对话模型如 gpt-3.5-turbo, gpt-4OpenAI 用于补全模型如 text-davinci-003 llm ChatOpenAI( model_namegpt-3.5-turbo, # 可根据需要和预算切换为 gpt-4 temperature0, # 温度设为0使输出更确定、更基于事实 openai_api_keyos.getenv(OPENAI_API_KEY) ) # 4. 创建检索问答链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # 最常用的类型将所有检索到的文档“塞”进提示词 retrievervectordb.as_retriever(search_kwargs{k: 4}), # 检索4个相关片段 chain_type_kwargs{prompt: PROMPT}, # 使用我们自定义的提示词 return_source_documentsTrue # 非常重要返回源文档用于引用和验证 ) return qa_chain def ask_question(qa_chain, question): 使用问答链提问并格式化输出。 result qa_chain.invoke({query: question}) print(f\n 问题{question}) print(f\n 答案{result[result]}) print(f\n 参考来源) for i, doc in enumerate(result[source_documents]): source doc.metadata.get(source, 未知) page doc.metadata.get(page, N/A) print(f {i1}. 文件{source} (页码{page})) # 可选打印一小段参考内容 # print(f 片段{doc.page_content[:150]}...) print(- * 50) if __name__ __main__: qa_chain create_qa_chain() # 测试提问 questions [ 公司的年假政策是怎样的, 如何申请报销, 介绍一下我们公司的主要产品。, 明天天气怎么样 # 这个问题在上下文中应该找不到答案 ] for q in questions: ask_question(qa_chain, q)深度解析RetrievalQA链这是 LangChain 提供的一个高级链它内部封装了“检索 - 组合上下文 - 调用 LLM - 解析输出”的完整流程。chain_typestuff这是最简单直接的方式将所有检索到的文档内容拼接后传入提示词。优点是信息完整缺点是可能超出模型上下文限制。其他类型如map_reduce、refine适用于处理非常多的文档。提示词工程我们定义的模板明确要求模型基于上下文回答并设置了“不知道”的兜底策略。这是生产系统中避免“幻觉”模型胡编乱造的关键。返回源文档return_source_documentsTrue让我们能向用户展示答案的依据增加可信度和可追溯性。5. 进阶打造一个能使用工具的智能体Agents文档问答是固定流程。对于更开放的任务比如“查询今天北京的天气然后用中文总结一下”我们需要智能体Agent。智能体能根据目标自主决定调用哪个工具天气API、计算器、搜索引擎等。下面我们创建一个能查询天气和进行简单计算的智能体。# weather_agent.py from langchain_openai import ChatOpenAI from langchain.agents import initialize_agent, AgentType from langchain.agents import Tool from langchain.utilities import SerpAPIWrapper, WikipediaAPIWrapper from langchain.chains import LLMMathChain import os # 注意以下工具需要额外的API密钥 # 工具1搜索引擎需要注册 SerpAPI try: search SerpAPIWrapper(serpapi_api_keyos.getenv(SERPAPI_API_KEY)) except: # 如果没配置我们用一个模拟的搜索工具 class MockSearch: def run(self, query): return f模拟搜索关于 {query} 的信息。 search MockSearch() # 工具2计算器基于LLM的数学计算无需额外API llm_for_math ChatOpenAI(temperature0, openai_api_keyos.getenv(OPENAI_API_KEY)) math_chain LLMMathChain.from_llm(llmllm_for_math, verboseFalse) # 工具3维基百科需要安装 wikipedia 库pip install wikipedia try: wiki WikipediaAPIWrapper() except: class MockWiki: def run(self, query): return f模拟维基百科{query} 的摘要。 wiki MockWiki() # 定义工具列表 tools [ Tool( name搜索引擎, funcsearch.run, description当你需要回答关于实时信息、最新事件或未知事实的问题时非常有用。输入应该是一个具体的搜索查询。 ), Tool( name计算器, funcmath_chain.run, description适用于解决数学计算、算术问题。输入应该是一个明确的数学表达式。 ), Tool( name维基百科, funcwiki.run, description用于查询关于人物、地点、公司、历史事件等事实性信息。输入应该是一个具体的主题名称。 ), ] def create_agent(): 创建一个具有多种工具的智能体 llm ChatOpenAI( model_namegpt-3.5-turbo, temperature0, # Agent 的思考需要确定性 openai_api_keyos.getenv(OPENAI_API_KEY) ) # 初始化智能体 # AgentType.ZERO_SHOT_REACT_DESCRIPTION 是一个通用且强大的类型 agent initialize_agent( toolstools, llmllm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, verboseTrue, # 设置为 True 可以看到智能体的思考过程调试时非常有用 handle_parsing_errorsTrue # 优雅地处理解析错误 ) return agent if __name__ __main__: agent create_agent() queries [ 北京今天的天气怎么样, 15的平方加上20除以4等于多少, 爱因斯坦的主要成就是什么, 先搜索一下LangChain的最新版本然后告诉我它是什么。 ] for query in queries: print(f\n 用户问题{query}) print(*40) try: response agent.invoke(query) print(f\n✅ 最终答案{response[output]}) except Exception as e: print(f\n❌ 执行出错{e}) print(*40 \n)运行智能体时你会看到类似以下的思考过程因为verboseTrue 用户问题北京今天的天气怎么样 Entering new AgentExecutor chain... 我需要找到北京今天的天气信息这需要实时数据我应该使用搜索引擎。 Action: 搜索引擎 Action Input: 北京今天天气 Observation: 模拟搜索关于 北京今天天气 的信息。 Thought: 我已经获得了北京天气的搜索结果现在可以给出答案了。 Action: Final Answer Final Answer: 根据搜索结果北京今天天气晴朗最高气温25°C最低气温15°C风力2-3级。 ✅ 最终答案根据搜索结果北京今天天气晴朗最高气温25°C最低气温15°C风力2-3级。智能体的核心ReAct 框架智能体遵循“思考Thought- 行动Action- 观察Observation”的循环直到得出最终答案。工具描述每个工具的description至关重要LLM 根据描述来决定是否以及如何使用该工具。适用场景适合流程不固定、需要外部信息或逻辑判断的复杂任务。但调用外部工具会增加延迟和成本且稳定性依赖于工具本身。6. 运行、验证与效果评估6.1 如何运行整个项目建议按以下步骤组织你的项目my_langchain_project/ ├── docs/ # 存放你的原始文档PDF, TXT, MD ├── chroma_db/ # 向量数据库持久化目录自动生成 ├── .env # 环境变量文件务必加入.gitignore ├── document_loader.py ├── vector_store.py ├── qa_chain.py ├── weather_agent.py └── main.py # 主入口文件main.py可以这样写# main.py import sys import os from dotenv import load_dotenv from qa_chain import create_qa_chain, ask_question from weather_agent import create_agent load_dotenv() def main(): print(欢迎使用 LangChain 演示系统) print(1. 文档问答系统 (RAG)) print(2. 多功能智能体 (Agent)) choice input(\n请选择模式 (1 或 2): ).strip() if choice 1: print(\n初始化文档问答链...) qa_chain create_qa_chain() print(初始化完成输入 quit 退出。) while True: question input(\n请输入你的问题: ).strip() if question.lower() in [quit, exit, q]: break if question: ask_question(qa_chain, question) elif choice 2: print(\n初始化智能体...) agent create_agent() print(初始化完成输入 quit 退出。) while True: query input(\n请输入你的指令: ).strip() if query.lower() in [quit, exit, q]: break if query: try: response agent.invoke(query) print(f\n 回答{response[output]}) except Exception as e: print(f\n❌ 出错{e}) else: print(无效选择。) if __name__ __main__: main()6.2 如何验证效果文档问答验证准确性问一个你知道答案在文档中的问题检查回答是否准确。引用溯源检查返回的source_documents是否确实包含了答案相关的文本块。拒答能力问一个文档中绝对没有的问题如“明天股票走势如何”检查模型是否回答“我不知道”或类似内容而不是胡编乱造。智能体验证工具选择正确性观察verbose日志看智能体是否为不同问题选择了正确的工具。任务完成度给一个多步骤任务如“计算圆的面积其中半径是5然后搜索一下圆周率的历史”看它是否能按顺序调用工具并整合结果。7. 避坑指南10个常见问题与解决方案在实际开发中你会遇到各种问题。下表总结了最常见的坑及其解决方法问题现象可能原因排查步骤解决方案导入错误No module named ‘langchain.llms’LangChain 版本 0.1.0使用了旧版导入路径。pip show langchain查看版本。新版应使用from langchain_openai import OpenAI或ChatOpenAI。查看官方迁移指南。调用 OpenAI API 超时或报错网络问题、API密钥错误、额度不足、模型名称错误。1. 检查.env文件是否正确加载。2. 在代码中打印os.getenv(“OPENAI_API_KEY”)前几位验证。3. 检查 OpenAI 账户余额和速率限制。确保密钥正确网络通畅模型名有效如gpt-3.5-turbo。可设置request_timeout参数。向量检索结果不相关1. 文档分割策略不佳。2. 嵌入模型不适合。3. 检索数量k设置不当。1. 检查分割后的文本块是否语义完整。2. 尝试不同的chunk_size和chunk_overlap。3. 手动测试几个查询的检索结果。1. 优化RecursiveCharacterTextSplitter的分隔符和大小。2. 尝试其他嵌入模型如text-embedding-3-large。3. 调整k值或使用MMR搜索来增加多样性。LLM 回答出现“幻觉”编造内容1. 提示词未强制要求基于上下文。2. 检索到的上下文不相关或不足。3. 模型temperature参数过高。1. 检查提示词模板。2. 检查检索到的源文档是否真的包含答案。3. 将temperature设为 0。1. 在提示词中明确写“基于以下上下文”和“如果不知道请说不知道”。2. 改进检索质量见上一条。3. 使用temperature0。处理长文档时提示词超长使用chain_type“stuff”且检索到的文档总长度超出模型上下文。计算所有检索块的总 token 数。1. 减少检索数量k。2. 使用chain_type“map_reduce”或“refine”。3. 对检索到的文档进行二次摘要压缩。智能体陷入循环不输出最终答案Agent 在 Thought-Action-Observation 循环中无法决定结束。开启verboseTrue观察思考过程。1. 优化工具的描述使其更精确。2. 设置max_iterations参数限制循环次数。3. 尝试不同的AgentType如STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION。运行速度非常慢1. 本地嵌入模型计算慢。2. 网络请求多如调用 OpenAI。3. 检索的向量库未做索引优化。1. 分析各步骤耗时。2. 检查是否每次提问都重新计算嵌入。1. 使用 API 嵌入模型如 OpenAI而非本地模型。2. 对向量库创建索引Chroma 默认会做。3. 使用异步调用langchain支持异步。无法加载特定格式文档缺少对应的文档加载器依赖。查看错误信息通常提示缺少某个库。安装对应的库如pip install pypdf用于 PDFpip install unstructured用于多种格式。生产环境部署后内存持续增长内存泄漏常见于未正确关闭或复用资源。监控部署后的内存使用情况。1. 确保数据库连接、HTTP 会话等资源被正确关闭。2. 考虑使用langchain的SQLite缓存或外部缓存如 Redis。3. 定期重启服务进程临时方案。答案格式不符合要求提示词中未指定输出格式。检查 LLM 的原始输出。在提示词模板中明确指定格式例如“请用 JSON 格式输出包含 ‘answer’ 和 ‘confidence’ 两个字段。”8. 最佳实践与工程化建议当你掌握了基础准备将 LangChain 应用投入生产时以下建议能帮你走得更稳。提示词标准化与版本管理不要将提示词硬编码在代码中。将其存储在配置文件如 YAML、JSON或数据库中。为不同的任务摘要、问答、分类创建不同的提示词模板并为其添加版本号便于 A/B 测试和回滚。# prompts/config.yaml qa_prompt_v1: | 请基于以下上下文回答问题。 上下文{context} 问题{question} 如果上下文不包含答案请说“根据现有资料无法回答”。 答案 qa_prompt_v2: | 你是一个专业的助理。请严格根据提供的资料回答问题。 资料{context} 问题{question} 请先判断资料是否充分若充分则给出答案否则告知信息不足。 答案实现可观测性与调试集成LangSmith这是 LangChain 官方提供的监控和调试平台。它能可视化追踪每一次链或智能体的调用步骤、输入输出、耗时和 token 消耗是排查生产问题不可或缺的工具。结构化日志在关键节点如检索前后、调用 LLM 前后记录日志包括请求 ID、用户 ID、耗时、检索到的文档 ID 等。构建稳健的检索系统RAG 核心分层索引对文档进行多粒度分割如章节、段落、句子建立多层索引根据问题复杂度选择不同粒度进行检索。查询重写与扩展在检索前先用 LLM 对原始用户问题进行改写或扩展以提高检索召回率。例如将“怎么请假”重写为“请假流程、申请步骤、休假制度”。后处理与重排序检索出 Top-K 个结果后可以使用一个更小的、更快的“重排序模型”对结果进行精排将最相关的结果放在前面再送入 LLM。成本与性能优化缓存对频繁出现的相同或相似查询的 LLM 结果进行缓存可以大幅降低成本和延迟。可以使用langchain的SQLiteCache或集成 Redis。模型选型并非所有任务都需要 GPT-4。对话、创意用gpt-3.5-turbo复杂推理用gpt-4嵌入用text-embedding-3-small。根据任务选择合适的模型。异步处理如果应用需要处理大量并发请求使用异步框架如 FastAPI和 LangChain 的异步接口。安全与合规输入输出过滤对用户输入进行严格的过滤和清理防止提示词注入攻击。对模型输出也要进行审查避免输出有害或不适当内容。数据隐私如果使用云端 LLM API如 OpenAI确保传输的数据不包含敏感个人信息。对于极高机密数据考虑使用本地部署的开源模型如通过Ollama部署 Llama 3。访问控制为你的 AI 应用接口添加认证和授权控制谁可以访问以及可以访问哪些数据。通过本文的梳理你应该已经超越了“调用 API”的层面理解了 LangChain 如何作为一个框架来系统化地构建 AI 应用。从文档加载、向量检索到问答链和智能体每一步都有其设计哲学和最佳实践。真正的掌握始于将这里的示例代码应用到你的真实数据和业务场景中并在过程中不断迭代和优化。记住框架是工具解决实际问题才是目的。现在你可以开始用这套“乐高积木”搭建属于你自己的 AI 应用了。