一.LangChain 是什么
LangChain 通过组合模块和能力抽象来扩展大型语言模型(LLM)的应用
开发者文档:https://python.langchain.com/docs/integrations/llms/
代码实现:https://github.com/langchain-ai/langchain/tree/master/libs/langchain/langchain/llms
二.为什么需要LangChain统一了对接LLM的抽象,便于行业沟通协作
LangChain 预实现了一些模块,例如帮助开发者更方便的管理 memory 和 提示词模板
三.Model I/O
大模型的输出:是模型对输入提示词的处理结果。 大语言模型的输出通常不稳定,langchain的output可以将不同大模型的结果规范化处理
BaseLanguageModel 是与大预言模型进行交互的抽象
主要提供三种方法:
虽然是顶级的抽象,但是三个方法也是存在直接或者间接的调用关系的
Demo2:格式化输出
这里需要注意一个点,格式化输出是将模型返回的非结构数据转换成结构化的数据,这中间是存在失败的可能性的
Chain 是 LangChain 中所有链式组件的抽象基类,它定义了结构化调用序列的统一接口。
核心特性链式组合:通过串联模型、检索器等组件构建复杂流程
状态管理:通过 memory 属性实现有状态调用
可观测性:通过 callbacks 支持日志记录等扩展功能
灵活调用:提供多种执行方式(call/run/invoke)
关键属性 属性说明默认值LLMChain 是 LangChain 中最基础的链式组件,由两大核心部分构成:
PromptTemplate - 定义输入变量的模板结构
语言模型 - 实际执行推理的 LLM 或 ChatModel
特点:
单输入单输出流水线
前一个链的输出自动作为下一个链的输入
适合线性处理流程
典型结构:
[链A] -> [链B] -> [链C]Demo1
from langchain.chains import SimpleSequentialChain# 假设已定义3个LLMChain:summary_chain, translate_chain, style_chain pipeline = SimpleSequentialChain(chains=[summary_chain, translate_chain, style_chain],verbose=True )# 执行整个流水线 result = pipeline.run("原始文本内容") SequentialChain(通用顺序链)特点:
支持多输入多输出
需要显式指定输入/输出变量名
适合复杂分支流程
关键参数:
input_variables: 整个流水线的初始输入变量
output_variables: 最终需要输出的变量
chains: 包含的链列表
Demo1:
from langchain.chains import LLMChain, SequentialChain from langchain.prompts import PromptTemplate from langchain.llms import OpenAI# 初始化模型(使用实际API key替换) llm = OpenAI(temperature=0.7, openai_api_key="your-api-key")# ========== 第一步:关键词提取 ========== keyword_prompt = PromptTemplate(input_variables=["document"],template="请从以下文本中提取3-5个最重要的关键词:\n{document}" ) keyword_chain = LLMChain(llm=llm,prompt=keyword_prompt,output_key="keywords", # 指定输出键名verbose=True )# ========== 第二步:问题生成 ========== question_prompt = PromptTemplate(input_variables=["keywords"],template="根据这些关键词生成3个相关问题: {keywords}" ) question_chain = LLMChain(llm=llm,prompt=question_prompt,output_key="generated_questions",verbose=True )# ========== 第三步:回答问题 ========== answer_prompt = PromptTemplate(input_variables=["document", "generated_questions"],template="基于以下文本回答问题:\n文本内容:{document}\n\n问题:{generated_questions}" ) answer_chain = LLMChain(llm=llm,prompt=answer_prompt,output_key="final_answer",verbose=True )# ========== 构建顺序链 ========== overall_chain = SequentialChain(chains=[keyword_chain, question_chain, answer_chain],input_variables=["document"], # 初始输入output_variables=["keywords", "generated_questions", "final_answer"], # 最终输出verbose=True )# ========== 执行链 ========== input_text = """ 人工智能是模拟人类智能的计算机系统。这些系统能够学习、推理、解决问题、理解自然语言和感知环境。 当前AI技术包括机器学习、深度学习和自然语言处理等。AI应用涵盖医疗诊断、自动驾驶和智能客服等领域。 """result = overall_chain({"document": input_text})# ========== 打印结果 ========== print("\n====== 原始输入 ======") print(input_text)print("\n====== 提取的关键词 ======") print(result["keywords"])print("\n====== 生成的问题 ======") print(result["generated_questions"])print("\n====== 最终答案 ======") print(result["final_answer"]) 五.Memory记忆系统是构建对话式AI应用的核心组件,它使模型能够保持上下文信息,实现连贯的多轮对话。
BaseMemory关键方法解析
@property @abstractmethod def memory_variables(self) -> List[str]:"""定义记忆系统提供的变量名列表"""声明记忆系统将向链注入哪些变量
@abstractmethod def load_memory_variables(self, inputs: Dict[str, Any]) -> Dict[str, Any]:"""根据当前输入加载记忆内容"""执行时机:在链处理用户输入前调用
参数:
- inputs:链接收的原始输入字典
返回值:要合并到链输入中的额外变量
执行时机:在链产生输出后调用
参数:
- inputs:链接收的原始输入
outputs:链产生的输出
1.读取阶段(READ)
在链执行核心逻辑前
从记忆系统加载历史信息
自动扩充用户当前输入
2.写入阶段(WRITE)
在链执行核心逻辑后
将当前交互的输入/输出保存到记忆系统
供后续对话使用
几种不同的Memory ConversationBufferMemory保存原始对话历史简单对话场景ConversationBufferMemory(保存完整历史)
场景:简单的多轮对话机器人
ConversationBufferWindowMemory(只保留最近N轮)
场景:限制上下文长度的客服系统
** ConversationSummaryMemory(摘要式记忆)**
场景:长时间对话的摘要保存
EntityMemory(实体记忆)
场景:需要记住特定信息的对话
Data Connection 的五大步骤:
加载数据(Load)
转换数据(Transform)
向量化(Embed)
存储(Store)
检索(Retrieve)
1. 加载数据:Document Loaders
数据来源广泛,比如 GitHub 仓库、YouTube 视频、微博、Twitter、Office 文档(PPT、Word、Excel)等。
LangChain 提供了丰富的 Document Loaders,支持的格式包括:
文件格式:CSV、HTML、JSON、Markdown、PDF、本地目录等;
数据源平台:Arxiv、Bilibili、GitHub、Reddit、TensorFlow Datasets 等。
加载器基类是 BaseLoader,其核心方法是:
def load(self) -> List[Document]:每个加载器会返回一个 Document 对象的列表。
2. 转换数据:Document Transformers
在加载原始数据后,往往需要进一步切分或处理,比如:
将一整本问答手册拆分为一个个问答对;
将 HTML 页面解析为纯文本;
对文档进行清洗、格式统一;
对本文根据语意进行拆分
等等
这部分由 Document Transformers 完成,支持包括分段、清洗、结构化处理等操作,是后续向量化前的关键步骤。
3. 向量化:Embedding Models
完成数据切分后,下一步就是将文本转换为向量,即embedding。
这些模型将文本转为固定维度的向量,作为后续存储与检索的基础。
4. 存储与检索:Vector Stores & Retriever
Embedding: 生成的向量会被存储到向量数据库中,
Retriever :模块负责根据查询向量查找最相似的 Document,用于 RAG(Retrieval-Augmented Generation)任务。
一个形象的比喻是:向量数据库就像是 AI 模型的“外接硬盘”,它能补充训练语料无法实时更新的缺陷,增强模型对实时和私域知识的获取能力。
Embedding 与 Vector Store 是一对组合
嵌入模型和向量数据库密切耦合,它们必须“对口”:
向量数据库只是一个容器,不关心向量内容;
嵌入模型负责将原始文本变成向量;
如果两者使用的向量空间不一致(如维度不同、模型不同),就会导致无法匹配和检索。
因此,Embedding Model 和 Vector Store 必须成对使用,保持一致的向量编码方式,才能在后续的检索中实现语义对齐。
通俗来讲,Agent 就像一个“具备感知、思考和行动能力”的智能个体。它通过环境输入感知信息,结合内在的记忆和推理机制,做出响应决策,并作用于环境,形成闭环。
Agent 的工作流程
[用户输入] → [Agent 感知输入] → [计划/推理/记忆] →
[工具调用或响应输出] → [更新记忆] → [继续任务 or 结束]
Demo
# ------------------------------- # 定义函数 from datetime import datetime def get_current_time():return datetime.now().strftime("%Y-%m-%d %H:%M:%S") # ------------------------------- # 根据函数构建工具 from langchain.tools import Tooltime_tool = Tool(name="GetCurrentTime",func=lambda x: get_current_time(),description="用来获取当前时间,不需要输入内容" ) # -------------------------------from langchain.agents import initialize_agent, AgentType from langchain.chat_models import ChatOpenAIllm = ChatOpenAI(temperature=0)agent = initialize_agent(tools=[time_tool],llm=llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,verbose=True, )response = agent.run("现在几点了?") print(response) Agent 和function calling的区别其实从代码实现上来看,Agent 与 function calling 有比较大的相似性,但是实际上二者的本质有所不同
对比:
维度Function CallingAgent