AI大模型企业应用实战-为Langchain Agent添加记忆功能

简介: 【8月更文挑战第18天】

本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!

  • 🚀 魔都架构师 | 全网30W技术追随者
  • 🔧 大厂分布式系统/数据中台实战专家
  • 🏆 主导交易系统百万级流量调优 & 车联网平台架构
  • 🧠 AIGC应用开发先行者 | 区块链落地实践者
  • 🌍 以技术驱动创新,我们的征途是改变世界!
  • 👉 实战干货:编程严选网

0 前言

在开发复杂的AI应用时,赋予Agent记忆能力是一个关键步骤。这不仅能提高Agent的性能,还能使其在多轮对话中保持上下文连贯性。本文详细介绍如何在Langchain框架中为Agent添加记忆功能,并深入解析每个步骤的原理和最佳实践。

Agent记忆功能的核心组件

Langchain构建具有记忆功能的Agent涉及核心组件:

  1. 工具(Tools): Agent用来执行特定任务的功能模块
  2. 记忆(Memory): 存储和检索对话历史的组件
  3. 大语言模型(LLM): 负责理解输入、决策和生成响应的核心智能体

协同工作,使得Agent在多轮对话中保持连贯性并做出明智决策。

1 构建Agent可用工具

定义Agent可用工具:

老版:

# 构建一个搜索工具,Langchain提供的一个封装,用于进行网络搜索。
search = SerpAPIWrapper()
# 创建一个数学计算工具,特殊的链,它使用LLM来解析和解决数学问题。
llm_math_chain = LLMMathChain(
    llm=llm,
    verbose=True
)
tools = [
    Tool(
        name = "Search",
        func=search.run,
        description="useful for when you need to answer questions about current events or the current state of the world"
    ),
    Tool(
        name="Calculator",
        func=llm_math_chain.run,
        description="useful for when you need to answer questions about math"
    ),
]
print(tools)

新版:

_ALLOWED_BIN_OPS = {
   
    ast.Add: operator.add,
    ast.Sub: operator.sub,
    ast.Mult: operator.mul,
    ast.Div: operator.truediv,
    ast.FloorDiv: operator.floordiv,
    ast.Mod: operator.mod,
    ast.Pow: operator.pow,
}
_ALLOWED_UNARY_OPS = {
   
    ast.UAdd: operator.pos,
    ast.USub: operator.neg,
}


def _safe_eval(node: ast.AST) -> Any:
    if isinstance(node, ast.Expression):
        return _safe_eval(node.body)
    if isinstance(node, ast.Constant) and isinstance(node.value, (int, float)):
        return node.value
    if isinstance(node, ast.BinOp) and type(node.op) in _ALLOWED_BIN_OPS:
        return _ALLOWED_BIN_OPS[type(node.op)](_safe_eval(node.left), _safe_eval(node.right))
    if isinstance(node, ast.UnaryOp) and type(node.op) in _ALLOWED_UNARY_OPS:
        return _ALLOWED_UNARY_OPS[type(node.op)](_safe_eval(node.operand))
    raise ValueError(f"unsupported expression: {ast.dump(node)}")


@tool
def calculator(expression: str) -> str:
    """Evaluate a basic arithmetic expression, for example '18 * 23 + 7'."""
    try:
        return str(_safe_eval(ast.parse(expression, mode="eval")))
    except Exception as exc:
        return f"计算失败:{exc}"


tools = [calculator]

if os.getenv("SERPAPI_API_KEY"):
    try:
        from langchain_community.utilities import SerpAPIWrapper

        _search = SerpAPIWrapper()

        @tool
        def web_search(query: str) -> str:
            """Search the web for current or external information."""
            return _search.run(query)

        tools.append(web_search)
    except ImportError as exc:
        print(f"SerpAPI 搜索工具未启用:{exc}")
tools

2 增加memory组件

为Agent添加记忆功能。

老版:

from langchain.memory import ConversationBufferMemory

# 记忆组件
memory = ConversationBufferMemory(
    # 指定了存储对话历史的键名
    memory_key="chat_history",
      # 确保返回的是消息对象,而不是字符串,这对于某些Agent类型很重要
    return_messages=True
)

3 定义agent

有了工具和记忆组件,可初始化Agent。

老版:

agent_chain = initialize_agent(
    tools, 
    llm, 
    handle_parsing_errors=True,
    memory=memory
)
  • handle_parsing_errors=True: 自动处理解析错误,提高Agent的稳定性。
  • memory=memory: 将我们之前定义的记忆组件传递给Agent。

新版:

# 负责保存状态
checkpointer = InMemorySaver()

agent = create_agent(
    model=llm,
    tools=tools,
    system_prompt="你是一个中文助手。需要计算时优先调用 calculator 工具。回答要简洁。",
    checkpointer=checkpointer,
)
# thread_id决定每次调用归属于哪段会话
config = {
   "configurable": {
   "thread_id": "qwen-memory-demo"}}

相同 thread_id 会读取历史消息,不同 thread_id 彼此隔离。

4 查看默认的agents prompt

了解Agent使用的默认提示词模板非常重要,有助理解Agent的行为并进行调整:

print(agent_chain.agent.prompt.messages)
print(agent_chain.agent.prompt.messages[0])
print(agent_chain.agent.prompt.messages[1])
print(agent_chain.agent.prompt.messages[2])

输出Agent使用的默认提示词模板。包括系统消息、人类消息提示词模板和AI消息模板:

5 优化Agent配置

为了更好地利用记忆功能,修改Agent配置,确保它在每次交互中都能访问对话历史,让Agent每次决策时都能考虑到之前对话内容。

老版

需用agent_kwargs传递参数,将chat_history传入

agent_chain = initialize_agent(
    tools, 
    llm, 
    handle_parsing_errors=True,#处理解析错误
    # 通过该参数可自定义Agent的行为
    agent_kwargs={
   
        "extra_prompt_messages":
      # chat_history用于插入对话历史
      [MessagesPlaceholder(variable_name="chat_history"),
      # agent_scratchpad用于Agent的中间思考过程
      MessagesPlaceholder(variable_name="agent_scratchpad")],
    },
    memory=memory #记忆组件
    )

老版 memory 思路

这套写法依赖旧 agent 抽象,memory 必须和 prompt 变量名对齐,agent_scratchpad、chat_history 放错就容易失效。

而新版重点是 thread_id。同一个 thread_id 会继续读取历史消息,不同 thread_id 就是独立会话。这更接近现在 LangChain/LangGraph 的状态模型。

6 验证优化后的提示词模板

print(agent_chain.agent.prompt.messages)
print(agent_chain.agent.prompt.messages[0])
print(agent_chain.agent.prompt.messages[1])
print(agent_chain.agent.prompt.messages[2])

能看到新添加的chat_history和agent_scratchpad占位符。

7 总结

LangChain 1.x 主流写法:create_agent + InMemorySaver + thread_id。工具改成 @tool,数学工具不再依赖旧 chain。

为Langchain Agent添加记忆,使得Agent能够在多轮对话中保持上下文连贯性,大大提高其在复杂任务中的表现。

添加记忆功能只是构建高效Agent第一步。按需调整记忆组件的类型和参数,或实现更复杂的记忆管理策略。

注意平衡记忆的深度和Agent响应速度。过多历史信息导致决策缓慢或偏离主题。因此,你可能需实现某种形式的记忆修剪或总结机制。

目录
相关文章
|
存储 人工智能 NoSQL
万字解码 Agentic AI 时代的记忆系统演进之路
本文深入探讨了在 Agentic AI 时代,记忆(Memory) 作为智能体核心能力的定义、构建与技术演进。
3407 9
万字解码 Agentic AI 时代的记忆系统演进之路
|
人工智能 缓存 监控
使用LangChain4j构建Java AI智能体:让大模型学会使用工具
AI智能体是大模型技术的重要演进方向,它使模型能够主动使用工具、与环境交互,以完成复杂任务。本文详细介绍如何在Java应用中,借助LangChain4j框架构建一个具备工具使用能力的AI智能体。我们将创建一个能够进行数学计算和实时信息查询的智能体,涵盖工具定义、智能体组装、记忆管理以及Spring Boot集成等关键步骤,并展示如何通过简单的对话界面与智能体交互。
3737 1
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段三:自定义 Advisor 与结构化输出实现以及对话记忆持久化开发
本文介绍如何在Spring AI中自定义Advisor实现日志记录、结构化输出、对话记忆持久化及多模态开发,结合阿里云灵积模型Qwen-Plus,提升AI应用的可维护性与功能性。
2106 125
AI 超级智能体全栈项目阶段三:自定义 Advisor 与结构化输出实现以及对话记忆持久化开发
|
存储 人工智能 搜索推荐
一种专为AI代理设计的内存层,能够在交互过程中记忆、学习和进化
Mem0 是专为 AI 代理设计的内存层,支持记忆、学习与进化。提供多种记忆类型,可快速集成,适用于开源与托管场景,助力 AI 代理高效交互与成长。
1012 123
一种专为AI代理设计的内存层,能够在交互过程中记忆、学习和进化
|
12月前
|
存储 人工智能 搜索推荐
LangGraph 记忆系统实战:反馈循环 + 动态 Prompt 让 AI 持续学习
本文介绍基于LangGraph构建的双层记忆系统,通过短期与长期记忆协同,实现AI代理的持续学习。短期记忆管理会话内上下文,长期记忆跨会话存储用户偏好与决策,结合人机协作反馈循环,动态更新提示词,使代理具备个性化响应与行为进化能力。
1934 10
LangGraph 记忆系统实战:反馈循环 + 动态 Prompt 让 AI 持续学习
|
人工智能 缓存 API
8大AI记忆优化策略助你突破智能体上下文限制
本文深入解析AI系统中的记忆管理策略,涵盖8种主流方案及工程实现,助你突破上下文限制,构建高效智能体。
2945 0
|
存储 人工智能 前端开发
从零构建智能对话助手:LangGraph + ReAct 实现具备记忆功能的 AI 智能体
本文系统介绍了基于 LangGraph 框架构建具备记忆能力的 ReAct(Reasoning + Action)智能体的技术实现方法。ReAct 智能体结合语言模型的推理能力与外部工具的执行能力,通过“思考-行动-观察”循环机制,实现复杂任务的自主处理。文章详细讲解了 LangGraph 的图结构设计、状态管理、工具集成与记忆系统等关键技术,并通过代码示例演示了从基础工作流到高级智能体系统的构建过程。最终实现的智能体具备多轮对话、工具调用、结果反馈与上下文记忆能力,为开发下一代智能应用提供了技术基础。
1819 1

热门文章

最新文章