如果说会话级记忆解决的是“对话连贯”问题,那么任务级记忆就是智能体区别于普通对话机器人的核心——它能记住当前任务的全流程,包括任务步骤、执行状态、中间结果、工具调用记录等,让智能体能自主规划、跟踪进度、处理异常,无需人工持续干预。

很多开发者在开发智能体时,会陷入“重对话、轻任务”的误区,用会话记忆替代任务记忆,导致智能体无法自主推进复杂任务,比如“开发养老智能体”这个任务,无法记住“已完成需求分析、未完成架构设计”,只能被动响应用户指令,失去了智能体的“自主性”。

任务级记忆的核心是“结构化存储任务流程”,生命周期为“单个任务”(从任务启动到完成/失败),任务结束后可清空,也可保存为长期记忆供后续复用。以下是工业界最常用的3种实现方式,从简易到标准,附完整可执行代码和落地经验。

一、简易实现:系统消息存储任务状态(新手快速验证)

这种方式的核心逻辑是“将任务记忆直接写入系统提示词(System Prompt)”,无需额外开发,简单直接,适合新手快速验证任务流程,或开发简单任务型智能体(如单一流程的任务助手)。

可执行代码

from langchain.schema import HumanMessage, AIMessage, SystemMessage
from langchain_openai import ChatOpenAI

# 初始化大模型(需替换为自己的API密钥)
llm = ChatOpenAI(model="gpt-3.5-turbo", api_key="你的API密钥")

# 任务记忆直接写入系统消息,结构化存储任务全流程
messages = [
    SystemMessage(content="""
    【任务记忆】
    当前任务:开发养老行业AI智能体
    任务步骤:1. 需求分析 2. 架构设计 3. 代码开发 4. 测试部署
    当前步骤:1. 需求分析(已完成)
    未完成步骤:2. 架构设计 3. 代码开发 4. 测试部署
    中间结果:已收集养老智能体3大核心需求(智能照护提醒、用药提醒、健康数据监测),明确老年用户操作便捷性要求
    工具调用记录:无
    任务状态:执行中
    异常记录:无
    """),
    HumanMessage(content="继续推进任务,下一步该做什么?请给出具体的架构设计方向。")
]

# 大模型结合任务记忆,生成下一步动作(自主推进任务)
response = llm.invoke(messages)
print("智能体下一步动作:")
print(response.content)

实操要点

  • 适用场景:新手快速验证任务流程、简单任务型智能体(单一流程、无复杂异常处理)。
  • 优点:开发速度快、无需额外依赖,无需封装类或调用复杂接口。
  • 缺点:不适合复杂任务,无法灵活更新任务状态、检索历史步骤,当任务步骤过多时,系统提示词会过于冗长。

二、标准实现:自定义TaskMemory类(工业级落地)

自定义TaskMemory类是工业界主流的实现方式,核心逻辑是“封装专门的任务记忆类,统一管理任务的步骤、状态、结果、工具调用等信息”,可灵活更新、查询、拼接Prompt,是AutoGPT、Dify、Coze等智能体平台的真实实现方式,适合复杂任务、生产环境落地。

任务级记忆需存储的核心信息(工业标准):

  • 当前任务名称(如“开发养老行业AI智能体”);
  • 任务步骤列表(按执行顺序排列,如“需求分析→架构设计→代码开发→测试部署”);
  • 当前执行步骤(如“处于架构设计阶段”);
  • 中间执行结果(与步骤对应,如“需求分析完成,整理出3大核心需求”);
  • 工具调用记录(工具名称、参数、结果,如“调用文档解析工具,提取养老行业需求”);
  • 任务状态(待执行/执行中/完成/失败);
  • 异常记录(错误信息、处理方式,如“架构设计遇到技术难点,调整方案为分模块开发”)。

可执行代码(可直接复用)

class TaskMemory:
    def __init__(self, task_name: str):
        """初始化任务记忆,传入任务名称"""
        self.task_name = task_name  # 当前任务名称
        self.steps = []             # 任务步骤列表(按执行顺序存储)
        self.current_step = 0       # 当前执行的步骤索引(从0开始)
        self.results = []           # 每一步的执行结果(与步骤一一对应)
        self.tools_used = []        # 工具调用记录(列表,存储字典:工具名称、参数、结果)
        self.status = "pending"     # 任务状态:pending(待执行)/processing(执行中)/completed(完成)/failed(失败)
        self.exceptions = []        # 异常记录(列表,存储字典:错误信息、处理方式)

    def add_step(self, step: str):
        """添加任务步骤(按执行顺序添加,不可乱序)"""
        self.steps.append(step)

    def update_step(self, step_index: int, new_step: str):
        """更新指定步骤的内容(当步骤需要调整时使用)"""
        if 0 <= step_index< len(self.steps):
            self.steps[step_index] = new_step
        else:
            raise IndexError("步骤索引超出范围,请检查步骤数量")

    def add_result(self, result: str):
        """添加当前步骤的执行结果(执行完一步后调用)"""
        self.results.append(result)

    def add_tool_usage(self, tool_name: str, tool_params: dict, tool_result: str):
        """添加工具调用记录(调用工具后立即调用)"""
        self.tools_used.append({
            "tool_name": tool_name,
            "tool_params": tool_params,
            "tool_result": tool_result
        })

    def update_status(self, status: str):
        """更新任务状态(需传入合法状态值)"""
        valid_status = ["pending", "processing", "completed", "failed"]
        if status in valid_status:
            self.status = status
        else:
            raise ValueError(f"非法状态值,仅支持{valid_status}")

    def add_exception(self, exception_msg: str, handle_method: str):
        """添加异常记录(遇到异常时调用,记录错误信息和处理方式)"""
        self.exceptions.append({
            "exception_msg": exception_msg,
            "handle_method": handle_method
        })

    def to_prompt(self) -> str:
        """将任务记忆转为字符串,用于拼接Prompt,供大模型调用"""
        # 处理步骤字符串(格式化输出)
        steps_str = [f"{i+1}. {step}" for i, step in enumerate(self.steps)] if self.steps else "无"
        # 处理执行结果字符串
        results_str = [f"步骤{i+1}:{result}" for i, result in enumerate(self.results)] if self.results else "无"
        # 处理工具调用记录(格式化输出)
        tools_str = ""
        if self.tools_used:
            for idx, tool in enumerate(self.tools_used, 1):
                tools_str += f"{idx}. 工具名称:{tool['tool_name']},参数:{tool['tool_params']},结果:{tool['tool_result']}\n"
        else:
            tools_str = "无"
        # 处理异常记录(格式化输出)
        exceptions_str = ""
        if self.exceptions:
            for idx, exc in enumerate(self.exceptions, 1):
                exceptions_str += f"{idx}. 错误信息:{exc['exception_msg']},处理方式:{exc['handle_method']}\n"
        else:
            exceptions_str = "无"
        
        return f"""
        【当前任务记忆】
        任务名称:{self.task_name}
        任务步骤:{steps_str}
        当前步骤:{self.current_step + 1}. {self.steps[self.current_step] if self.steps else "无"}
        执行结果:{results_str}
        工具调用记录:{tools_str}
        任务状态:{self.status}
        异常记录:{exceptions_str}
        请结合以上任务记忆,自主推进下一步工作,确保任务连贯、不遗漏步骤,遇到异常时参考异常处理方式,若未记录异常则主动提出解决方案。
        """

# ------------------- 实际使用示例(可直接复用) -------------------
# 1. 初始化任务记忆(传入任务名称)
task_memory = TaskMemory(task_name="开发养老行业AI智能体")

# 2. 添加任务步骤(按执行顺序)
task_memory.add_step("需求分析:收集养老智能体核心需求,明确用户场景和操作要求")
task_memory.add_step("架构设计:设计智能体的记忆、工具、推理模块,适配老年用户操作")
task_memory.add_step("代码开发:实现核心功能(照护提醒、用药提醒、健康数据监测)")
task_memory.add_step("测试部署:验证功能完整性,适配社区养老服务中心设备,上线使用")

# 3. 更新任务状态和步骤结果(执行完需求分析后)
task_memory.update_status("processing")  # 任务状态改为执行中
task_memory.add_result("需求分析完成:核心需求为智能照护提醒、用药提醒、健康数据监测;用户场景为社区养老服务中心,老年用户操作需简单、支持语音控制;需对接社区现有传感器和电子病历系统。")
task_memory.current_step = 1  # 推进到第2步(架构设计)

# 4. 模拟工具调用(架构设计阶段调用文档解析工具)
task_memory.add_tool_usage(
    tool_name="文档解析工具",
    tool_params={"file_path": "养老行业需求文档.pdf", "chunk_size": 500},
    tool_result="提取到养老行业核心痛点:老年用户操作复杂、需求场景分散、设备兼容性差;行业政策支持智能养老设备研发,可申请相关补贴。"
)

# 5. 模拟异常记录(架构设计阶段遇到技术难点)
task_memory.add_exception(
    exception_msg="架构设计中,记忆模块与工具模块兼容性差,无法实现实时数据同步",
    handle_method="调整架构设计,采用模块化拆分,增加数据同步中间层,确保记忆模块与工具模块独立运行且数据互通"
)

# 6. 提取任务记忆,拼接Prompt,供大模型调用
prompt = task_memory.to_prompt() + "\n请给出架构设计阶段的具体实施步骤,重点解决记忆模块与工具模块的兼容性问题。"
print("拼接后的Prompt(含任务记忆):")
print(prompt)

实操要点

  • 适用场景:复杂任务、生产环境、需要自主推进的智能体(如自动开发、自动运维、复杂需求处理)。
  • 优点:结构化、可扩展、灵活,可根据任务需求新增字段(如“任务截止时间”“负责人”),可直接集成到智能体框架中。
  • 落地技巧:
    • 步骤添加需按执行顺序,避免乱序;
    • 每执行完一步,立即调用add_result()更新结果,确保任务记忆与实际执行进度一致;
    • 工具调用后立即记录,便于后续追溯和问题排查;
    • 异常记录需详细,包括错误信息和处理方式,帮助大模型自主解决异常。

三、LangChain官方Agent任务记忆(最便捷,快速落地)

如果不想手动封装TaskMemory类,可直接使用LangChain的Agent框架——它已内置任务记忆功能,无需额外开发,只需绑定会话记忆,Agent会自动保存任务步骤、工具调用、中间结果,适合快速搭建智能体,尤其适合熟悉LangChain框架的开发者。

可执行代码

from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferWindowMemory
from langchain.tools import Tool
from langchain.prompts import ChatPromptTemplate

# 1. 初始化大模型和会话记忆(任务记忆依赖会话记忆,保存任务相关对话和操作)
llm = ChatOpenAI(model="gpt-3.5-turbo", api_key="你的API密钥")
# 滑动窗口记忆,保留最近5轮对话(包含任务步骤、工具调用)
memory = ConversationBufferWindowMemory(k=5, memory_key="chat_history", return_messages=True)

# 2. 定义工具(模拟任务中需要调用的工具,可根据实际需求新增)
def demand_analysis_tool(file_path: str) -> str:
    """需求分析工具:解析养老行业需求文档,提取核心需求和用户场景"""
    return "提取到养老智能体核心需求:智能照护提醒、用药提醒、健康数据监测;用户场景:社区养老服务中心,老年用户操作需简单、支持语音控制;需对接社区现有传感器和电子病历系统。"

def architecture_design_tool(module: str) -> str:
    """架构设计工具:根据模块名称,生成智能体架构设计方案"""
    if module == "记忆模块":
        return "记忆模块设计:采用会话级+长期级组合,会话级用滑动窗口记忆(k=5),长期级用向量检索记忆,存储用户偏好和行业知识;支持实时更新和语义检索。"
    elif module == "工具模块":
        return "工具模块设计:采用模块化拆分,包含需求分析、文档解析、数据对接3个子模块,支持主流传感器和电子病历接口,确保兼容性。"
    else:
        return f"未找到{module}的设计方案,请明确模块名称。"

# 注册工具(Agent将自动调用工具推进任务)
tools = [
    Tool(
        name="需求分析工具",
        func=demand_analysis_tool,
        description="用于解析养老行业需求文档,提取智能体核心需求、用户场景和对接要求,参数为文档路径(file_path)"
    ),
    Tool(
        name="架构设计工具",
        func=architecture_design_tool,
        description="用于生成养老智能体各模块的架构设计方案,参数为模块名称(module),支持记忆模块、工具模块等"
    )
]

# 3. 定义Prompt模板(包含任务记忆相关提示,引导Agent自主推进任务)
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的AI智能体,负责自主推进养老智能体开发任务,结合对话历史(含任务步骤、工具调用、中间结果),自主规划步骤、调用工具,确保任务按流程推进,不遗漏关键环节。"),
    ("placeholder", "{chat_history}"),  # 会话记忆(自动保存任务相关信息,即任务记忆)
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}")  # Agent推理过程(自动记录,辅助任务推进)
])

# 4. 创建Agent,自动绑定任务记忆(依赖会话记忆存储任务信息)
agent = create_openai_tools_agent(llm, tools, prompt)
# 初始化Agent执行器,开启verbose=True,可查看任务推进过程
agent_executor = AgentExecutor(agent=agent, memory=memory, verbose=True)

# 5. 启动任务,Agent会自动记录任务记忆并自主推进
print("启动养老智能体开发任务,Agent将自主规划步骤、调用工具:")
agent_executor.invoke({"input": "帮我开发一个养老行业AI智能体,先从需求分析开始,逐步推进到测试部署"})

实操要点

  • 适用场景:熟悉LangChain框架、需要快速落地智能体、任务流程相对标准化的场景。
  • 优点:LangChain内置,无需手动封装TaskMemory类,开发效率高,可快速验证任务流程。
  • 缺点:定制化程度较低,复杂任务(如多异常处理、自定义任务状态)可能需要二次开发,修改Agent的推理逻辑。

四、任务级记忆落地总结

任务级记忆的核心是“让智能体自主推进任务”,选择实现方式时需结合开发成本、任务复杂度:

  • 新手验证、简单任务:系统消息存储任务状态(开发快、零依赖);
  • 复杂任务、生产环境:自定义TaskMemory类(结构化、可扩展、灵活);
  • LangChain用户、快速落地:LangChain官方Agent任务记忆(无需封装、效率高)。

关键提醒:任务记忆与会话记忆不能替代——会话记忆只存“对话文本”,任务记忆存“任务流程”,二者结合才能实现智能体的“连贯交互+自主推进”。

更多推荐