个人工作中对于LangChain的学习
对于一个技术框架来说,我们进行学习时的第一步是:是什么?有什么作用?怎么用?
接下来的内容将根据这三个问题展开来说一下我个人的一些看法。
官方文档:https://langchain-doc.cn/
LangChain的概念
LangChain是一个基于大语言模型用于构建一个端到端语言模型应用的框架,它提供了一系列工具、套件和接口、让开发者使用语言模型来实现各种复杂的任务,如文本到图像的生成、文档问答、聊天机器人等。简单的来说就是一个开发由大型语言模型(LLMs)驱动的应用程序的框架。
LangChain的作用
LangChain对于一名AI应用工程师的作用体现在大幅减少重复造轮子,原生调用大模型 API,你要自己手写大量通用逻辑什么文档加载、文本切分、对话历史存储与拼接、向量检索逻辑、提示词管理、结果格式化、常捕获、多步骤任务调度。LangChain 是把这些通用组件全部封装好的。
对于我来说LangChain的作用如下几点:
1.封装 RAG、对话记忆、任务编排、Agent 等通用能力,避免重复开发;
2.提供统一接口抽象,便捷切换各类公有、私有化大模型;
3.标准化实现知识库问答、智能工具代理等主流 AI 业务场景;
4.支持业务流程模块化编排,便于调试、维护与团队协作,帮助工程师快速把 LLM 落地为可 用的业务系统。
我的学习也将围绕LangChain的核心组件展开:模型(Models),提示模版(Prompts),数据检索(Indexes),记忆(Memory),链(Chains),代理(Agents)。
LangChain的安装
安装指定版本的LangChain(这里我使用的是conda,PyCharm,使用清华源下载)
pip install langchain==0.3.7-i https://pypi.tuna.tsinghua.edu.cn/simple pip install langchain-openai==0.2.3-i//https:pypi.tuna.tsinghua.edu.cn/simple说明:新版 LangChain 采用分包设计,各大模型的对接包独立拆分出去,langchain-openai是专门对接 OpenAI 兼容接口的包;后续如果接入智谱、通义千问等模型,还需要安装对应的langchain-xxx适配包。(我的学习中使用的是智谱)
完成对LangChain的安装了,我觉得对模型的使用我们可以概括为三个部分:输出提示(format)、调用模型(predict)、输出解析(parse)。也是LingChain中的model I/O。
补充说明:langchain-openai 是独立的集成包,在新版 LangChain 中,各个大模型的对接包都做了拆分,不再内置在 langchain 主包内。如果后续要接入智谱、通义千问等其他模型,还需要安装对应的langchain-xxx适配包。
Model I/O:模型输入输出(提示词 → 调用 → 解析)
Model I/O 是 LangChain 最基础、最底层的一条链路,所有上层组件,不管是 Chain 还是 Agent,底层都离不开这套流程。它把和大模型交互这件事拆成三层,职责清晰:
1.Prompt:提示模板格式化
提示词不能硬写在代码里。PromptTemplate可以定义模板字符串,预留变量占位符,运行时传入参数自动填充,生成发给大模型的完整 prompt。
好处是提示词统一管理、方便修改、支持多语言、支持动态传入上下文。`
fromlangchain_core.promptsimportPromptTemplate prompt=PromptTemplate(input_variables=["question"],template="你是一名AI助手,请简洁回答用户问题:{question}")formatted_prompt=prompt.format(question="LangChain是什么?")print(formatted_prompt)`2.Model:调用大模型
LangChain 把 LLM、ChatModel 做了抽象。
在LangChain中LLM用于文本补全模型,输入字符串,返回字符串。
ChatModel:对话模型,输入消息列表(SystemMessage、HumanMessage、AIMessage),返回对话消息,更适合聊天场景。
只需要更换模型实例,上层提示词代码几乎不用改动,这就是前面提到的统一抽象能力。
fromlangchain_openaiimportChatOpenAI llm=ChatOpenAI(model="gpt-4o-mini",api_key="你的key",base_url="接口地址")response=llm.invoke(formatted_prompt)print(response.content)- Output Parser:输出解析器
大模型返回的是自然文本,不稳定。很多场景我们想要结构化结果:JSON、列表、布尔值。
输出解析器用来约束、提取、转换模型返回内容,自动校验格式,失败时还能让模型重试。
常用:StrOutputParser(拿到纯文本)、JsonOutputParser(输出 JSON)。
fromlangchain_core.output_parsersimportStrOutputParser parser=StrOutputParser()result=parser.parse(response)print(result)这三个组件还可以用|管道符串联起来,也就是 LangChain 的LCEL(LangChain Expression Language),这是新版推荐的写法,替代老旧 Chain:
chain=prompt|llm|parser res=chain.invoke({"question":"LCEL是什么"})print(res)一行链路,清晰直观,支持流式输出、异步、批处理,是现在开发的主流方式。
那么LangChain与其他技术的区别,也就是它的特点我们就差不多学习完了。接下来来了解一下LangChain的四大核心组件:
核心组件一:Indexes 数据检索(RAG 基础)
单纯调用大模型有两个痛点:知识滞后、不能读取私有文档。Indexes 模块就是为检索增强生成(RAG)服务的。
整套流程:文档加载 → 文档分割 → 向量化 → 存入向量库 → 检索。
- Document Loaders:加载器,读取 pdf、md、docx、网页等文件,统一转成
Document对象; - Text Splitters:文本切分器,按字符、递归字符、语义切割,避免上下文超长;
- Embeddings:嵌入模型,把文本转为向量;
- VectorStore:向量数据库,持久化向量,支持相似度检索;
- Retriever:检索器,对外提供统一查询接口,拿到相关片段,塞到提示词里交给大模型。
RAG 的核心思路:先查相关资料,再把资料 + 用户问题一起发给大模型,让模型基于资料回答,而不是靠模型自身的参数记忆。
核心组件二:Memory 对话记忆
大模型本身是无状态的,单次调用互不认识,不知道上一轮聊了什么。Memory 组件负责保存对话历史。
常见几种记忆:
- ConversationBufferMemory:完整保存全部对话;
- ConversationSummaryMemory:自动总结历史,节省 token;
- ConversationBufferWindowMemory:只保留最近 N 轮对话;
- 持久化记忆:把对话存在数据库、Redis,多轮会话、多用户隔离。
记忆本质就是:在每次调用模型前,把历史对话拼接进 prompt,让模型拥有上下文感知。在做聊天机器人时是必用组件。
核心组件三:Chains 链
Chain 代表一串有序执行的任务,把多个组件按顺序串起来,输入传给第一个组件,输出交给下一个。
早期 LangChain 大量使用内置 Chain:RetrievalQA、ConversationChain等。
现在官方更推荐 LCEL 管道写法,灵活度远高于固定 Chain。
- 简单链:单轮问答;
- 顺序链:多个任务依次执行,A 的输出是 B 的输入;
- 并行链:多个分支同时执行,结果合并;
Chain 解决的是:把单一步骤,组装成一条业务流水线。
核心组件四:Agents 代理
Chain 是流程固定的,代码写死执行顺序;Agent 不一样:让大模型自己思考下一步要做什么、调用哪个工具。
Agent 包含:大模型、工具列表、Agent 执行器。
工具可以是:搜索引擎、计算器、查询数据库、调用自定义接口。
运行逻辑:
- 用户提问;
- Agent 思考:我能不能直接回答?信息不足,我需要调用哪个工具?
- 调用工具拿到结果;
- 把工具返回结果再交给模型,整理答案返回用户;
Agent 适合开放式、不确定步骤的任务,缺点是不可控,容易无限循环、误调用工具,生产环境要做好限制、校验、超时控制。