1. 引言为什么需要 LangChain在人工智能特别是大语言模型LLM飞速发展的今天我们拥有了像 GPT、Claude、文心一言等强大的通用模型。然而将这些模型直接应用到复杂的业务场景中往往会遇到诸多挑战数据孤岛模型无法直接访问企业内部数据库、知识库或实时数据。功能单一模型擅长对话和文本生成但难以执行具体的工具调用如计算、搜索、调用API。缺乏记忆与状态简单的问答无法支持多轮、有上下文的复杂对话或任务。开发复杂将模型、数据源、工具、记忆等组件串联起来需要大量的胶水代码。LangChain 应运而生。它是一个用于开发由语言模型驱动的应用程序的框架。其核心思想是“链”Chain通过将 LLM 与各种外部组件数据、工具、记忆连接起来构建出功能强大、可定制的 AI 应用。简单来说LangChain 让大模型从“什么都懂一点的聊天专家”变成了可以真正为你“干活”的智能助手。本文将带你从零开始全面学习 LangChain 的核心概念、组件并通过实战案例掌握其应用方法。2. LangChain 核心概念与架构理解 LangChain首先要掌握其六大核心模块它们构成了 LangChain 应用的基本骨架模型 I/O (Model I/O)与各种语言模型交互的抽象层。包括LLMs文本输入文本输出如 GPT-3。Chat Models基于消息列表System, Human, AI进行对话的模型如 GPT-4, Claude。提示词 (Prompts)将用户输入和指令模板化更精准地引导模型。数据连接 (Retrieval)让模型能够访问和应用特定数据。这是构建“知识型”应用的关键。文档加载器 (Document Loaders)从各种来源文本、PDF、网页、数据库加载数据。文本分割器 (Text Splitters)将长文档切分成模型可处理的片段。向量存储 (Vectorstores)将文本片段转换为向量嵌入并存储实现相似性搜索。检索器 (Retrievers)从向量存储中根据问题检索最相关的文档片段。链 (Chains)将多个组件模型、提示词、工具等按顺序组合起来完成复杂任务。这是 LangChain 的灵魂。LLMChain最基本的链组合一个提示词和一个模型。SequentialChain按顺序执行多个链。RetrievalQA一个经典的链结合检索和问答。记忆 (Memory)在对话或调用之间持久化状态使模型拥有“记忆”。ConversationBufferMemory简单存储所有对话历史。ConversationBufferWindowMemory只保留最近 K 轮对话。ConversationSummaryMemory对历史对话进行总结性记忆。代理 (Agents)让模型自主决定调用哪些工具Tools来完成任务是构建“自主智能体”的核心。工具 (Tools)模型可以调用的函数如搜索、计算、API调用。代理执行器 (Agent Executor)运行代理处理模型决策和工具调用循环。回调 (Callbacks)用于日志记录、监控、流式传输等方便调试和观察应用运行过程。3. 环境搭建与快速开始3.1 安装 LangChain首先确保你已安装 Python (推荐 3.8)。然后使用 pip 安装 LangChain 及其可选依赖。# 安装核心 LangChain 包pipinstalllangchain# 安装常用的社区集成包例如 OpenAI 模型pipinstalllangchain-openai# 安装用于文档加载和向量存储的包pipinstalllangchain-community chromadb tiktoken3.2 设置 API 密钥以使用 OpenAI 模型为例你需要设置环境变量。importos os.environ[‘OPENAI_API_KEY’]‘你的-OpenAI-API-密钥’3.3 你的第一个 LangChain 应用简单问答让我们用不到 10 行代码创建一个最简单的 LLM 调用。fromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParser# 1. 创建模型llmChatOpenAI(model“gpt-3.5-turbo”)# 2. 创建提示词模板promptChatPromptTemplate.from_template(“请用一句话解释什么是{concept}?”)# 3. 创建链提示词 - 模型 - 输出解析chainprompt|llm|StrOutputParser()# 4. 调用链resultchain.invoke({“concept”:“人工智能”})print(result)# 输出示例人工智能是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。4. 实战案例一构建本地知识库问答机器人我们将构建一个能回答关于特定文档比如公司手册、技术文档内容的机器人。这是 LangChain 最经典的应用之一。步骤 1加载与处理文档fromlangchain_community.document_loadersimportTextLoaderfromlangchain_text_splittersimportRecursiveCharacterTextSplitter# 加载文档这里以 txt 为例也支持 PDF, HTML 等loaderTextLoader(“./company_handbook.txt”)documentsloader.load()# 分割文本text_splitterRecursiveCharacterTextSplitter(chunk_size500,# 每个片段大小chunk_overlap50# 片段间重叠部分保持上下文)docstext_splitter.split_documents(documents)print(f”将文档切分成了{len(docs)}个片段”)步骤 2向量化并存储fromlangchain_openaiimportOpenAIEmbeddingsfromlangchain_community.vectorstoresimportChroma# 使用 OpenAI 的嵌入模型将文本转换为向量embeddingsOpenAIEmbeddings()# 创建向量数据库并存储所有片段vectorstoreChroma.from_documents(documentsdocs,embeddingembeddings,persist_directory“./chroma_db”)# persist_directory 参数会将向量数据库持久化到本地下次可直接加载步骤 3创建检索问答链fromlangchain.chainsimportRetrievalQAfromlangchain_openaiimportChatOpenAI# 从本地加载已创建的向量数据库vectorstoreChroma(persist_directory“./chroma_db”,embedding_functionembeddings)# 创建检索器retrievervectorstore.as_retriever(search_kwargs{“k”:3})# 检索最相关的 3 个片段# 创建 LLMllmChatOpenAI(model“gpt-3.5-turbo”,temperature0)# 创建 RetrievalQA 链qa_chainRetrievalQA.from_chain_type(llmllm,chain_type“stuff”,# 将检索到的文档“塞”进提示词retrieverretriever,return_source_documentsTrue# 返回参考来源)# 提问question“公司规定的年假有多少天” resultqa_chain.invoke({“query”:question})print(“答案”,result[“result”])print(“\n参考来源”)fordocinresult[“source_documents”]:print(f”-{doc.page_content[:200]}...”)5. 实战案例二创建具有记忆和工具调用能力的智能代理我们将创建一个能记住对话历史并能调用搜索引擎和计算器的智能代理。步骤 1定义工具fromlangchain.agentsimporttoolfromlangchain.toolsimportDuckDuckGoSearchRunimportmath# 工具1网络搜索searchDuckDuckGoSearchRun()# 工具2自定义计算器工具tooldefcalculator(expression:str)-str:“”“计算一个数学表达式。例如‘calculator(‘35*2’)’”“”try:# 安全评估这里使用简单示例生产环境需更安全的评估方法resulteval(expression,{“__builtins__”:{}},{“math”:math})returnstr(result)exceptExceptionase:returnf”计算错误{e}”步骤 2创建具有记忆的代理fromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportAgentExecutor,create_react_agentfromlangchain.memoryimportConversationBufferMemoryfromlangchainimporthub# 拉取一个标准的 ReAct 提示词模板prompthub.pull(“hwchase17/react-chat”)# 创建 LLMllmChatOpenAI(model“gpt-3.5-turbo”,temperature0)# 创建记忆memoryConversationBufferMemory(memory_key“chat_history”,return_messagesTrue)# 定义工具列表tools[search,calculator]# 创建代理agentcreate_react_agent(llm,tools,prompt)# 创建代理执行器agent_executorAgentExecutor(agentagent,toolstools,memorymemory,verboseTrue,# 打印详细思考过程handle_parsing_errorsTrue# 优雅处理解析错误)步骤 3与代理对话# 第一轮对话responseagent_executor.invoke({“input”:“你好我是小明。今天北京的天气怎么样”})print(“AI:”,response[“output”])# 代理会思考并调用搜索工具然后给出答案。# 第二轮对话代理记得上下文responseagent_executor.invoke({“input”:“我刚刚问的是哪个城市另外请计算一下15的平方根。”})print(“AI:”,response[“output”])# 代理会从记忆中找到“北京”并调用计算器工具计算 sqrt(15)。6. 高级主题与最佳实践提示词工程精心设计提示词是提升效果性价比最高的方式。使用FewShotPromptTemplate进行少样本学习。链的组装与调试使用LangSmithLangChain 官方平台可视化跟踪和调试链的每一步执行。生产化部署使用LangServe轻松将任何链部署为 REST API。性能优化对检索结果进行重排序 (Re-ranking)提升精度。使用异步调用提高并发性能。对提示词和模型结果进行缓存节省成本和时间。安全性谨慎处理用户输入防止提示词注入攻击对工具调用如计算器进行严格的输入验证和沙箱隔离。7. 总结与展望LangChain 通过其模块化设计极大地降低了大模型应用开发的门槛。从简单的提示词链到复杂的自主代理它提供了一整套工具和抽象。核心价值标准化提供了与大模型交互的统一模式。组件化像搭积木一样组合功能。生态丰富集成了海量的数据源、工具和平台。学习建议从官方文档开始LangChain 文档是最好、最全面的学习资源。动手实践复制本文案例更换自己的数据和问题体验整个过程。深入源码对于复杂问题理解核心模块的源码能帮助你更好地定制和调试。随着多模态模型和智能体Agent技术的发展LangChain 也在不断进化未来将更好地支持图像、音频处理以及更复杂的任务规划和协作。现在正是深入学习并利用 LangChain 构建下一代 AI 应用的最佳时机。