玄同 765
大语言模型 (LLM) 开发工程师 | 中国传媒大学 · 数字媒体技术(智能交互与游戏设计)
CSDN · 个人主页 | GitHub · Follow
关于作者
- 深耕领域:大语言模型开发 / RAG 知识库 / AI Agent 落地 / 模型微调
- 技术栈:Python | RAG (LangChain / Dify + Milvus) | FastAPI + Docker
- 工程能力:专注模型工程化部署、知识库构建与优化,擅长全流程解决方案
「让 AI 交互更智能,让技术落地更高效」
欢迎技术探讨与项目合作,解锁大模型与智能交互的无限可能!
在大模型应用开发中,你是否曾被这些问题困扰:
- 如何让大模型调用外部工具(如数据库、API)?
- 如何将大模型与自有知识库结合,实现精准问答?
- 如何构建多轮对话系统,让模型记住上下文?
- 如何将大模型能力封装为可复用的组件?
LangChain 作为大模型应用开发的 “瑞士军刀”,通过一系列模块化核心组件,让开发者可以像搭乐高积木一样快速构建复杂的大模型应用。本文将从底层原理出发,带你彻底搞懂 LangChain 的核心组件,以及如何用它们构建生产级大模型应用。
一、LangChain 的核心设计理念:模块化与可组合性
LangChain 的核心理念是将大模型应用拆解为独立组件,通过组合实现复杂功能。这些组件可以独立使用,也可以灵活组合,覆盖了大模型应用开发的全流程:
每个组件都有明确的职责,开发者可以根据需求选择合适的组件进行组合,大大降低了大模型应用的开发门槛。
二、核心组件 1:模型层(Models)—— 大模型的 “接口层”
提示:运行以下示例前,请确保已安装最新版核心包及插件:
pipinstall-U langchain langchain-openai langchain-community langchain-text-splitters faiss-cpu
模型层是 LangChain 与大模型交互的核心组件。在 LangChain 1.0+ 中,所有模型都继承自Runnable接口,支持统一的invoke调用。
1. 核心类型
(1)LLM(大语言模型)
处理纯文本输入输出。
fromlangchain_openaiimportOpenAI# 初始化OpenAI LLM (需要环境变量 OPENAI_API_KEY)# llm = OpenAI(model_name="gpt-3.5-turbo-instruct", temperature=0.7)# 使用 Mock LLM 演示(无需 API Key)fromlangchain_core.language_models.llmsimportLLMfromtypingimportOptional,List,AnyclassMockLLM(LLM):def_call(self,prompt:str,stop:Optional[List[str]]=None,**kwargs:Any)->str:returnf"这是关于{prompt[:10]}的技术博客内容..."@propertydef_llm_type(self)->str:return"mock"llm=MockLLM()# 推荐使用 invoke 方法response=llm.invoke("请写一篇关于LangChain的技术博客")print(response)(2)ChatModel(对话模型)
专门处理对话场景,输入输出均为消息对象(Messages)。
fromlangchain_openaiimportChatOpenAIfromlangchain_core.messagesimportHumanMessage,SystemMessage# chat_model = ChatOpenAI(model="gpt-3.5-turbo")# 使用 Mock ChatModel 演示fromlangchain_core.language_models.chat_modelsimportBaseChatModelfromlangchain_core.outputsimportChatResult,ChatGenerationfromlangchain_core.messagesimportAIMessageclassMockChatModel(BaseChatModel):def_generate(self,messages,stop=None,**kwargs):returnChatResult(generations=[ChatGeneration(message=AIMessage(content="你好!我是 AI 技术博主。"))])@propertydef_llm_type(self):return"mock"chat_model=MockChatModel()# 多轮对话messages=[SystemMessage(content="你是一名专业的技术博客作者"),HumanMessage(content="请写一篇关于LangChain核心组件的技术博客")]response=chat_model.invoke(messages)print(response.content)(3)EmbeddingModel(嵌入模型)
将文本转换为向量,用于语义检索。
fromlangchain_openaiimportOpenAIEmbeddings# embeddings = OpenAIEmbeddings()# 使用 Mock Embeddings 演示fromlangchain_core.embeddingsimportEmbeddingsclassMockEmbeddings(Embeddings):defembed_documents(self,texts:List[str])->List[List[float]]:return[[0.1]*1536for_intexts]defembed_query(self,text:str)->List[float]:return[0.1]*1536embeddings=MockEmbeddings()# 生成文本向量text="LangChain is a framework for building LLM applications"vector=embeddings.embed_query(text)print(f"向量维度:{len(vector)}")2. 关键特性
- 统一接口:不同大模型的接口差异被抽象为统一的 API,开发者无需为每个模型单独适配;
- 参数配置:支持温度(temperature)、最大 Token 数(max_tokens)等参数的全局配置;
- 异步支持:所有模型都支持异步调用,提升大模型应用的并发性能;
- 模型缓存:支持缓存模型响应,避免重复调用相同请求,降低成本。
三、核心组件 2:数据连接层(Data Connection)—— 大模型的 “知识库”
数据连接层负责将外部数据(如文档、数据库、API 数据)与大模型结合,实现检索增强生成(RAG)。
1. 核心组件
(1)Document Loaders(文档加载器)
将外部文档加载为 LangChain 的Document对象。目前这些加载器主要位于langchain-community包中。
fromlangchain_community.document_loadersimportPyPDFLoader# 加载PDF文档# loader = PyPDFLoader("langchain_whitepaper.pdf")# documents = loader.load()# print(f"加载的文档页数:{len(documents)}")(2)Text Splitters(文本分割器)
将长文档分割为小片段。LangChain 现在拥有独立的langchain-text-splitters包。
fromlangchain_text_splittersimportRecursiveCharacterTextSplitter# 初始化文本分割器text_splitter=RecursiveCharacterTextSplitter(chunk_size=1000,# 每个片段的最大字符数chunk_overlap=200# 片段之间的重叠部分)# 模拟分割文档# split_documents = text_splitter.split_documents(documents)(3)Vector Stores(向量数据库)与 Retrievers(检索器)
存储向量并支持语义检索。建议使用langchain-chroma或FAISS。
fromlangchain_community.vectorstoresimportFAISS# 模拟文档数据fromlangchain_core.documentsimportDocument docs=[Document(page_content="LangChain 是一个大模型应用开发框架")]# 使用前面定义的 embeddings (MockEmbeddings) 创建本地向量库vector_store=FAISS.from_documents(docs,embeddings)# 创建检索器retriever=vector_store.as_retriever(search_kwargs={"k":1})# 执行检索retrieved_docs=retriever.invoke("什么是 LangChain?")print(f"检索结果:{retrieved_docs[0].page_content}")四、核心组件 3:链(Chains)与 LCEL —— 组件的 “流水线”
链(Chains)负责将多个组件组合成一个可执行的流水线。在 LangChain 1.0+ 中,推荐使用LangChain Expression Language (LCEL)来构建链,它比传统的Chain类更灵活、更易于调试。
1. 现代组合方式:LCEL
LCEL 允许你使用|运算符将 Prompt、模型和输出解析器连接起来。
fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParser# 创建 Prompt 模板prompt=ChatPromptTemplate.from_template("请写一篇关于 {topic} 的技术博客")# 构建 LCEL 链 (Prompt -> LLM -> OutputParser)chain=prompt|chat_model|StrOutputParser()# 执行链response=chain.invoke({"topic":"LangChain 1.0 架构"})print(response)2. 传统链(Legacy Chains)
虽然官方推荐 LCEL,但传统的LLMChain、RetrievalQA等在旧代码库中依然常见。
# 旧版导入方式try:fromlangchain.chainsimportLLMChainexceptImportError:print("请安装 langchain 包以使用旧版链")3. 为什么选择 LCEL?
LCEL 不仅仅是一种语法糖,它为现代大模型应用提供了核心工程能力:
- 流式处理 (Streaming):自动支持从模型到输出解析器的流式输出;
- 并行执行 (Parallelism):使用
RunnableParallel轻松实现并发调用; - 异步支持 (Async):所有 LCEL 链原生支持
ainvoke; - 中间步骤可视化:可以轻松追踪链中的每一个环节。
五、核心组件 4:记忆(Memory)—— 大模型的 “对话上下文”
记忆组件负责存储对话历史。在 1.0+ 架构中,推荐直接在 LCEL 链中管理消息历史,或者使用RunnableWithMessageHistory。
1. 基础记忆:ConversationBufferMemory
这是最简单的记忆组件,存储完整的对话历史。
try:fromlangchain.memoryimportConversationBufferMemoryexceptImportError:print("请安装 langchain 包以使用旧版记忆组件")# 初始化记忆组件memory=ConversationBufferMemory()# 在传统对话链中使用# from langchain.chains import ConversationChain# conversation = ConversationChain(llm=llm, memory=memory)2. 现代记忆管理方式
现代做法是使用ChatMemoryHistory配合RunnableWithMessageHistory,这样可以更好地控制状态持久化。
fromlangchain_community.chat_message_historiesimportChatMessageHistoryfromlangchain_core.runnables.historyimportRunnableWithMessageHistory# 初始化消息历史history=ChatMessageHistory()# 现代链配合历史记录(伪代码示例)# with_history = RunnableWithMessageHistory(chain, lambda session_id: history)六、核心组件 5:代理(Agents)—— 大模型的 “决策中心”
代理(Agents)让大模型可以根据用户请求,自主决策调用哪些工具。
1. 现代 Agent 构建方式
LangChain 现在推荐使用create_react_agent或更强大的LangGraph。以下是一个标准的 ReAct Agent 构建流程:
fromlangchain.agentsimportcreate_react_agent,AgentExecutorfromlangchainimporthub# 1. 定义工具集fromlangchain_core.toolsimporttool@tooldefget_weather(city:str)->str:"""获取指定城市的实时天气"""returnf"{city}的天气是:晴,25度"tools=[get_weather]# 2. 获取 ReAct 提示词模板 (需要联网或手动定义)# prompt = hub.pull("hwchase17/react")# 这里我们模拟一个简单的 Prompt 模板fromlangchain_core.promptsimportPromptTemplate template="尽力回答以下问题。你可以使用以下工具:{tools}... 问题:{input} {agent_scratchpad}"prompt=PromptTemplate.from_template(template)# 3. 构建 Agent 运行器# agent = create_react_agent(chat_model, tools, prompt)# executor = AgentExecutor(agent=agent, tools=tools, verbose=True)# 4. 执行任务# response = executor.invoke({"input": "北京今天天气怎么样?"})注意:对于更复杂的逻辑控制,推荐学习 LangGraph,它是目前构建生产级 AI Agent 的首选框架。
七、核心组件 6:工具(Tools)—— 大模型的 “手脚”
工具是大模型与外部系统交互的接口。在 1.0+ 中,推荐使用@tool装饰器。
fromlangchain_core.toolsimporttoolfrompydanticimportBaseModel,FieldclassSearchInput(BaseModel):query:str=Field(description="搜索关键词")@tool("search_tool",args_schema=SearchInput)defsearch(query:str)->str:"""在互联网上搜索信息"""returnf"搜索结果:{query}的相关信息..."八、组件组合:构建生产级大模型应用 (RAG 实战)
通过组合 LangChain 的核心组件,我们可以快速构建复杂的生产级大模型应用。以下是一个典型的检索增强生成 (RAG)系统示例(使用 Mock 组件演示可运行流程):
fromlangchain_core.runnablesimportRunnablePassthroughfromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.promptsimportChatPromptTemplate# 1. 模拟检索器 (Retriever)classMockRetriever:definvoke(self,query:str):return"LangChain 的核心价值在于其模块化设计和强大的生态系统。"retriever=MockRetriever()# 2. 定义 Prompt 模板template="""基于以下内容回答问题: {context} 问题: {question} """prompt=ChatPromptTemplate.from_template(template)# 3. 构建 LCEL RAG 链# 使用前面定义的 chat_model (MockChatModel)rag_chain=({"context":retriever.invoke,"question":RunnablePassthrough()}|prompt|chat_model|StrOutputParser())# 4. 执行问答response=rag_chain.invoke("LangChain 的核心价值是什么?")print(f"RAG 回答:{response}")九、总结:LangChain 的核心价值
LangChain 1.0+ 的核心价值在于标准化与工程化。
- 模型层:通过
Runnable接口统一了所有组件的调用方式; - 数据连接层:标准化的 RAG 流程,极大降低了知识库构建难度;
- LCEL:声明式的链式表达,让复杂的逻辑变得清晰且易于并行化;
- 生态化:丰富的社区插件(Community)和合作伙伴集成(OpenAI, Anthropic 等)。
如果你想构建稳定、可扩展的大模型应用,掌握 LangChain 1.0+ 的模块化设计和 LCEL 是必经之路!