背景与目标读者 LangChain 是一个面向大型语言模型(Large Language Models, LLM)应用开发的开源框架,由 Harrison Chase 于 2022 年发布,并在 2023 年成立公司后快速发展。它通过统一的抽象与模块化组件,帮助开发者高效构建复杂的 AI 应用,如聊天机器人、文档问答(RAG)、智能代理(Agent)与自动摘要等。
本文面向有一定 Python 基础、希望系统了解并快速上手 LangChain 的工程师与技术爱好者,覆盖核心组件、常见应用场景与可运行示例代码。
LangChain 是什么,为什么需要它?
统一接口:屏蔽不同模型与服务的差异(如 OpenAI、Hugging Face、本地模型等),提供一致的调用方式。
组件化设计:围绕模型、提示(Prompt)、链(Chain)、代理(Agent)、记忆(Memory)、索引(Indexes/Retriever)等模块化组合,便于扩展与维护。
工程化能力:提供可观测(Callbacks)、持久化(Checkpointers/Message History)、工具接入(Tools)、生态集成(VectorStore/Embeddings/Loaders)等工程能力。
核心组件与用法速览 1) 模型(Models) 对接各类聊天/补全模型,常见通过 langchain-openai
、langchain-community
、langchain-anthropic
等包集成。
1 2 3 4 5 6 from langchain_openai import ChatOpenAImodel = ChatOpenAI(model="gpt-4o-mini" , temperature=0.2 ) resp = model.invoke("用一句话解释什么是RAG?" ) print (resp.content)
2) 提示(Prompts) 将系统指令、示例与用户输入组织为模板,支持变量插值与角色化消息。
1 2 3 4 5 6 from langchain_core.prompts import ChatPromptTemplateprompt = ChatPromptTemplate.from_messages([ ("system" , "你是一名资深AI助教,输出要简洁准确。" ), ("human" , "请用要点列举回答:{question}" ) ])
3) 链(Chains / LCEL) 使用 LangChain Expression Language(LCEL)以“管道”方式组合组件。
1 2 3 4 from langchain_core.output_parsers import StrOutputParserchain = prompt | model | StrOutputParser() print (chain.invoke({"question" : "LangChain 的核心组件有哪些?" }))
4) 代理(Agents) 让 LLM 作为决策引擎,基于工具(Tools)动态选择行动,如搜索、计算或代码执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 from langchain.tools import toolfrom langchain.agents import create_react_agent, AgentExecutor@tool def add (a: float , b: float ) -> float : """Return a + b""" return a + b tools = [add] agent = create_react_agent(model, tools) executor = AgentExecutor(agent=agent, tools=tools, verbose=True ) print (executor.invoke({"input" : "请计算 12.5 与 7.5 的和,然后用一句中文描述结果。" })["output" ])
5) 记忆(Memory) 存储会话历史,使多轮对话更连贯。推荐以 RunnableWithMessageHistory
使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 from langchain_core.chat_history import InMemoryChatMessageHistoryfrom langchain_core.runnables.history import RunnableWithMessageHistoryhistory_store = {} def get_history (session_id: str ): return history_store.setdefault(session_id, InMemoryChatMessageHistory()) conversational_chain = RunnableWithMessageHistory( chain, get_history, input_messages_key="question" , history_messages_key="history" , ) print (conversational_chain.invoke( {"question" : "记住我喜欢Python。" }, config={"configurable" : {"session_id" : "u1" }} )) print (conversational_chain.invoke( {"question" : "我刚才说我喜欢哪种语言?" }, config={"configurable" : {"session_id" : "u1" }} ))
6) 索引 / 检索(Indexes / VectorStores / Retrievers) 将文档切分、向量化并索引,供模型检索以提升事实性(RAG)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 from langchain_community.vectorstores import FAISSfrom langchain_openai import OpenAIEmbeddingsfrom langchain_text_splitters import RecursiveCharacterTextSplitterdocs = [ "LangChain 提供统一的模型接口与组件化能力。" , "RAG 将检索与生成结合,提升回答的准确性。" ] splitter = RecursiveCharacterTextSplitter(chunk_size=100 , chunk_overlap=20 ) splits = splitter.create_documents(docs) embeddings = OpenAIEmbeddings() vectordb = FAISS.from_documents(splits, embeddings) retriever = vectordb.as_retriever(k=2 ) context_docs = retriever.invoke("什么是RAG?" ) print ([d.page_content for d in context_docs])
快速开始:环境与第一个程序 安装与准备 1 pip install -U "langchain>=0.2" langchain-openai langchain-community langchain-text-splitters faiss-cpu python-dotenv
配置密钥(以 OpenAI 为例),建议使用环境变量或 .env
:
1 setx OPENAI_API_KEY "sk-xxxxxxxx"
Hello, LangChain(LCEL 版) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import osfrom langchain_openai import ChatOpenAIfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParseros.environ["OPENAI_API_KEY" ] = os.getenv("OPENAI_API_KEY" , "<YOUR_KEY>" ) model = ChatOpenAI(model="gpt-4o-mini" , temperature=0.2 ) prompt = ChatPromptTemplate.from_messages([ ("system" , "你是专业的技术助理,回答务必准确且简洁。" ), ("human" , "{question}" ) ]) chain = prompt | model | StrOutputParser() print (chain.invoke({"question" : "一句话介绍LangChain。" }))
常见使用场景与示例 场景一:知识库问答(RAG) 将企业文档做切分与向量化,检索相关片段并与提示拼接后交给模型生成答案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import osfrom langchain_openai import ChatOpenAI, OpenAIEmbeddingsfrom langchain_community.vectorstores import FAISSfrom langchain_text_splitters import RecursiveCharacterTextSplitterfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParserdocs = [ "LangChain 是用于构建由大型语言模型驱动应用的框架。" , "它包含模型、提示、链、代理、记忆与索引等组件。" , ] splitter = RecursiveCharacterTextSplitter(chunk_size=120 , chunk_overlap=20 ) splits = splitter.create_documents(docs) emb = OpenAIEmbeddings() vectordb = FAISS.from_documents(splits, emb) retriever = vectordb.as_retriever(k=2 ) prompt = ChatPromptTemplate.from_messages([ ("system" , "请基于给定上下文回答用户问题,若无法从上下文得到答案,请明确说明。上下文:\n{context}" ), ("human" , "问题:{question}" ) ]) model = ChatOpenAI(model="gpt-4o-mini" , temperature=0 ) parser = StrOutputParser() def rag_answer (question: str ) -> str : context_docs = retriever.invoke(question) context = "\n\n" .join(d.page_content for d in context_docs) chain = prompt | model | parser return chain.invoke({"context" : context, "question" : question}) print (rag_answer("LangChain 的核心组件是什么?" ))
场景二:多轮聊天机器人(会话记忆) 使用 RunnableWithMessageHistory
追踪对话上下文,使回答更连贯。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 from langchain_core.chat_history import InMemoryChatMessageHistoryfrom langchain_core.runnables.history import RunnableWithMessageHistoryfrom langchain_openai import ChatOpenAIfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParserprompt = ChatPromptTemplate.from_messages([ ("system" , "你是友好的中文助理,记住用户偏好。" ), ("placeholder" , "{history}" ), ("human" , "{question}" ) ]) chain = prompt | ChatOpenAI(model="gpt-4o-mini" , temperature=0.3 ) | StrOutputParser() store = {} def get_history (sid ): return store.setdefault(sid, InMemoryChatMessageHistory()) conv = RunnableWithMessageHistory(chain, get_history, input_messages_key="question" , history_messages_key="history" ) sid = "user-42" print (conv.invoke({"question" : "我喜欢Go语言,请记住。" }, config={"configurable" : {"session_id" : sid}}))print (conv.invoke({"question" : "我喜欢哪种语言?" }, config={"configurable" : {"session_id" : sid}}))
场景三:长文档摘要 将长文切分后分别摘要,再做聚合(Map-Reduce 思路)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 from langchain_text_splitters import RecursiveCharacterTextSplitterfrom langchain_openai import ChatOpenAIfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParsertext = """ LangChain 通过统一抽象与模块化组件,帮助开发者构建LLM应用……(长文略) """ splits = RecursiveCharacterTextSplitter(chunk_size=300 , chunk_overlap=50 ).split_text(text) model = ChatOpenAI(model="gpt-4o-mini" , temperature=0 ) parser = StrOutputParser() map_prompt = ChatPromptTemplate.from_template("请用中文简洁总结:{chunk}" ) map_chain = map_prompt | model | parser summaries = [map_chain.invoke({"chunk" : c}) for c in splits] reduce_prompt = ChatPromptTemplate.from_template("将以下摘要合并为一段清晰总结:\n{points}" ) reduce_chain = reduce_prompt | model | parser final_summary = reduce_chain.invoke({"points" : "\n" .join(summaries)}) print (final_summary)
场景四:工具调用/数据分析代理 通过 Agent 使用工具(如计算、搜索、数据库查询)来完成复杂任务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 from langchain.tools import toolfrom langchain.agents import create_react_agent, AgentExecutorfrom langchain_openai import ChatOpenAI@tool def multiply (a: float , b: float ) -> float : """Multiply two numbers""" return a * b tools = [multiply] agent = create_react_agent(ChatOpenAI(model="gpt-4o-mini" ), tools) executor = AgentExecutor(agent=agent, tools=tools) print (executor.invoke({"input" : "请计算 3.2 乘以 8,并给出中文说明。" })["output" ])
进阶与工程化建议
版本与依赖:
推荐使用 langchain>=0.2
与分包(langchain-openai
、langchain-community
等);不同版本 API 可能有变更。
向量库可选 Lancedb、FAISS、Chroma、Milvus、PGVector 等;生产建议持久化与备份策略。
可观测与调试:
使用 Callbacks 记录 Token 成本与时延;保留提示与上下文以便复现。
安全与隐私:
使用环境变量存储 API Key,不要硬编码;
对数据做脱敏,遵守隐私合规;
明确第三方服务的数据保留政策。
部署建议:
后端服务化(FastAPI 等),前后端分离;
缓存热点向量检索与响应;
结合队列与异步提高吞吐。
常见问题(FAQ)
输出偶尔不稳定?
降低 temperature
,并在提示中明确约束输出格式;
为 RAG 增强检索质量(更好的切分、合适的 k
值与重排序)。
检索不相关?
优化切分策略与嵌入模型;尝试添加领域示例与更明确的系统指令。
Agent 行为“走偏”?
限制可用工具、添加防护指令与超时;在日志中审计推理轨迹。
参考资料
LangChain 官方文档(入门/指南/组件):https://python.langchain.com/docs/
OpenAI 接入(langchain-openai):https://python.langchain.com/docs/integrations/chat/openai
向量数据库(FAISS/Chroma/Milvus):https://python.langchain.com/docs/integrations/vectorstores/
本文由 AI 辅助生成,如有错误或建议,欢迎指出。