一、LangChain核心组件概述

LangChain的核心价值在于“连接”——将大语言模型(LLM)与外部工具、记忆功能、业务逻辑串联,实现更复杂、更具实用性的AI应用。本次重点学习三大核心模块:Tools工具(预制+自定义)、Memory记忆功能、多种内置链,以及Memory的实操应用(多轮对话历史记录)。

二、Tools工具:让LLM拥有“动手能力”

Tools工具是LangChain让LLM突破“纯文本生成”的关键,允许模型调用外部资源(如搜索、计算、数据库查询等),解决自身无法处理的问题(如实时信息、复杂计算)。核心逻辑:LLM根据用户需求,判断是否需要调用工具、调用哪个工具、如何传递参数,最终整合工具返回结果,生成最终回答。

2.1 预制工具(内置工具)

LangChain已封装好大量常用工具,无需从零开发,直接导入使用,核心常用预制工具如下,附使用场景和简单示例:

  • SerpAPI(搜索引擎工具):用于获取实时信息(如新闻、天气、最新数据),解决LLM知识库滞后的问题。 使用前提:需要申请SerpAPI密钥,安装依赖(pip install langchain-serpapi)。 简单示例:调用SerpAPI查询“2026年马年春节日期”,让LLM结合搜索结果给出准确回答。

  • MathTool(数学计算工具):用于处理复杂数学运算(如加减乘除、函数计算、矩阵运算),避免LLM计算出错。 核心工具:Calculator(基础计算)、PythonREPL(更灵活的Python代码执行,支持复杂计算)。

  • FileTool(文件操作工具):用于读取、写入本地文件(如txt、pdf、docx),实现与本地文档的交互。 常用工具:ReadFile(读取文件内容)、WriteFile(写入内容到文件),需注意文件路径权限。

  • DatabaseTool(数据库工具):用于连接SQL数据库(MySQL、PostgreSQL等),实现数据查询、新增、修改等操作,适用于数据驱动的场景。

预制工具的核心优势:开箱即用,减少开发成本;与LangChain其他组件(链、Memory)无缝集成,无需额外适配。

2.2 自定义工具

当预制工具无法满足业务需求(如调用自有API、内部系统)时,可自定义工具。自定义工具需遵循LangChain的Tool接口规范,核心步骤如下:

  1. 定义工具函数:编写具体的工具逻辑(如调用自有API、处理特定业务逻辑),函数需包含输入参数、执行逻辑、返回结果。 注意:函数需明确说明“功能描述”“输入参数说明”,方便LLM判断是否调用该工具。

  2. 封装为LangChain Tool对象:使用LangChain提供的@tool装饰器,或直接实例化Tool类,指定工具名称、描述、函数等参数。

  3. 测试工具:单独测试工具能否正常运行,确保输入输出符合预期;再将工具集成到链中,测试与LLM的联动效果。

自定义工具示例:封装一个“获取公司内部员工信息”的工具,调用内部员工管理API,根据员工ID返回员工姓名、部门、入职时间等信息。

关键注意点:工具的描述必须清晰、准确,LLM会根据描述判断是否调用该工具;工具的异常处理(如API调用失败、参数错误)需完善,避免影响整体流程。

三、Memory记忆功能:让LLM拥有“长期记忆”

默认情况下,LLM的对话是“无状态”的——每一轮对话都是独立的,无法记住上一轮的提问、回答或用户信息。Memory功能的作用的是:保存对话历史、用户信息等上下文,让LLM能够基于历史记录生成连贯的回答,实现多轮对话的流畅性。

3.1 Memory工具的核心类型及使用

LangChain提供多种Memory类型,适配不同场景,核心常用类型如下:

  • ConversationBufferMemory(对话缓冲记忆) 功能:简单保存所有对话历史(用户提问+AI回答),不做任何压缩,适用于短对话场景。 使用场景:简单的多轮对话(如3-5轮),无需节省token。 特点:直观、简单,但对话过长时,token消耗大,可能影响LLM响应速度。

  • ConversationBufferWindowMemory(对话窗口记忆) 功能:只保存最近N轮对话历史(可设置window_size参数),丢弃更早的对话,适用于长对话场景。 使用场景:多轮长对话,需要控制token消耗,同时保留近期上下文。 示例:设置window_size=3,仅保存最近3轮对话,避免历史对话过多导致token溢出。

  • ConversationSummaryMemory(对话摘要记忆) 功能:将对话历史进行摘要压缩,保存摘要而非完整对话,大幅减少token消耗,适用于超长对话。 原理:每新增一轮对话,LLM会自动将新对话与历史摘要合并,生成新的摘要。 使用场景:需要长期记忆对话核心内容,但无需保留每一轮的完整细节。

  • ConversationEntityMemory(对话实体记忆) 功能:提取对话中的实体(如人名、地名、物品)及相关信息,单独保存,适用于需要记住特定实体细节的场景(如客户咨询、产品介绍)。

Memory的核心使用逻辑:实例化Memory对象,将其传入链中,链会自动将对话历史传入LLM,实现上下文关联。

3.2 为链增加Memory

LangChain的Chain(链)是串联LLM、Tools、Memory的核心载体,为链增加Memory的步骤非常简单,核心流程如下:

  1. 导入所需的Memory类(如ConversationBufferMemory)。

  2. 实例化Memory对象,可设置相关参数(如window_size、return_messages等)。 示例:memory = ConversationBufferMemory(return_messages=True) (return_messages=True表示返回完整的对话消息列表,便于链处理)。

  3. 实例化Chain时,将memory参数指定为创建的Memory对象。 常用链:ConversationChain(对话链,专门用于多轮对话)、LLMChain(基础链)。

  4. 调用链的run方法,进行多轮对话,Memory会自动保存对话历史。

关键注意点:不同的链对Memory的支持略有差异,优先使用ConversationChain处理多轮对话,其对Memory的适配性最好;若链中包含Tools,Memory会同时保存工具调用的历史记录,便于LLM后续参考。

四、多种内置链的介绍与使用

LangChain的内置链(Built-in Chains)是预先封装好的“业务模板”,将LLM、Tools、Memory等组件提前组合,无需手动串联,直接调用即可实现特定功能。核心常用内置链如下:

4.1 ConversationChain(对话链)

核心用途:专门用于多轮对话,是最常用的内置链,默认支持Memory功能,可直接实现上下文连贯的对话。

使用场景:客服对话、日常聊天、咨询问答等需要多轮交互的场景。

特点:简洁易用,可灵活搭配不同的Memory类型,支持自定义LLM模型。

4.2 LLMChain(基础链)

核心用途:最基础的链,仅串联“LLM+提示词模板(PromptTemplate)”,不默认包含Memory和Tools,适用于简单的单轮文本生成场景。

使用场景:文本生成、摘要、翻译、改写等单轮任务,可手动添加Memory和Tools扩展功能。

4.3 ToolChain(工具链)

核心用途:串联LLM与多个Tools,让LLM能够根据需求自动选择、调用工具,解决需要外部资源的复杂问题。

常用子链: - RetrievalQAChain:检索问答链,结合文档检索工具(如VectorDB),实现“文档问答”(从指定文档中查找答案)。 - AgentChain:智能代理链,让LLM拥有“自主决策能力”,可自主判断是否调用工具、调用顺序,适用于复杂任务(如数据分析、多步骤查询)。

4.4 SequentialChain(顺序链)

核心用途:按固定顺序执行多个子链,前一个子链的输出作为后一个子链的输入,适用于多步骤、有依赖关系的任务。

示例:先使用LLMChain生成文章大纲,再使用另一个LLMChain根据大纲生成完整文章,两个链按顺序执行。

五、实践:多轮对话历史记录(Memory实操)

本次实践使用ConversationChain+ConversationBufferMemory,实现多轮对话历史记录,确保对话上下文连贯,步骤如下(基于Python代码):

5.1 环境准备

  1. 安装依赖:pip install langchain openai(本次使用OpenAI的LLM模型,也可替换为其他模型,如ChatGLM、Llama等)。

  2. 配置API密钥:设置OpenAI API Key(需自行申请),确保能够正常调用LLM。

5.2 代码实现

from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory

# 1. 初始化LLM模型
llm = ChatOpenAI(
    model_name="gpt-3.5-turbo",  # 模型名称
    temperature=0.7,  # 随机性,0-1,越低越严谨
    api_key="你的OpenAI API Key"
)

# 2. 初始化Memory(对话缓冲记忆,保存所有对话历史)
memory = ConversationBufferMemory(return_messages=True)  # return_messages=True返回消息列表

# 3. 初始化对话链,传入LLM和Memory
conversation_chain = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True  # 开启详细日志,可查看对话历史和LLM调用过程
)

# 4. 多轮对话测试
print("开始多轮对话(输入'退出'结束):")
while True:
    user_input = input("用户:")
    if user_input == "退出":
        print("对话结束!")
        break
    # 调用链,获取回答
    response = conversation_chain.run(user_input)
    print(f"AI:{response}")
    # 查看当前对话历史(可选)
    print("当前对话历史:", memory.load_memory_variables({}))

5.3 实践效果说明

  • 每一轮对话后,Memory会自动保存“用户提问+AI回答”,下一轮对话时,LLM会基于历史记录生成回答。

  • 示例效果: 用户:我叫小明,今年25岁。 AI:你好小明!25岁正是充满活力的年纪呢~ 用户:我喜欢打篮球,你知道我多大吗? AI:当然知道啦,你刚才说你今年25岁呀,喜欢打篮球真是个不错的爱好呢!

  • 若替换为ConversationBufferWindowMemory,设置window_size=2,仅保存最近2轮对话,超过2轮的历史会被丢弃,可用于控制token消耗。

5.4 注意事项

  • API密钥需妥善保管,避免泄露;若使用国内模型(如ChatGLM),需替换对应的LLM类(如ChatGLM4)。

  • Memory的选择需根据对话长度:短对话用ConversationBufferMemory,长对话用ConversationBufferWindowMemory或ConversationSummaryMemory。

  • verbose=True仅用于调试,生产环境可关闭,避免日志过多。

六、核心总结

  1. Tools:让LLM“走出”纯文本,通过预制工具快速实现常用功能,通过自定义工具适配业务需求。

  2. Memory:解决LLM无状态问题,通过不同类型的Memory保存对话上下文,实现多轮对话连贯。

  3. 内置链:封装好的业务模板,简化开发流程,不同链适配不同场景(对话、检索、多步骤任务)。

  4. 实操关键:Memory与ConversationChain的配合是实现多轮对话的核心,需根据场景选择合适的Memory类型。

 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐