avatar

刘刚刚的blog

采菊东篱下,悠然见南山🦥

  • 首页
  • python
  • 大模型应用
  • 软件/工具导航页
  • 关于
Home agent会话中用户主动暂停消息的处理方案
文章

agent会话中用户主动暂停消息的处理方案

Posted recently Updated recently
By Administrator
8~11 min read

背景:

在用户与 agent聊天的时候,用户可能主动暂停当前轮次的对话,然后重新向大模型发送消息。

用户暂停会话可能带来的风险:如果此时刚好 agent发送完工具调用的指令,工具未执行完成。那么在用户的下一轮对话时,因为未响应大模型的工具调用结果,可能导致大模型调用报错。

初步调研

简单看了几个厂家大模型对话暂停的处理方案(非 agent场景):

  1. deepseek会删除当前轮次的对话

  2. gemini则还会保留当前的会话

image-20250703154611392

处理方案

在这种场景下,用户在下一轮对话前,程序需要对历史消息进行检查,以防止报错。

检查的方案:

  1. 如果最后一条消息没有 ai 的工具调用,那么删除和不删除都不会影响程序的正常执行,这种情况无需处理。

  2. 如果最后一条历史消息中包含工具调用,那么可以考虑:

    • 删除当次的会话:需要注意的是,当前轮次涉及到的多条消息,都需要删除掉。

    • 主动拼接工具的返回:通过消息告诉大模型工具调用失败(实现见后续)

## 主动拼接工具回复的代码示例

以下代码在langchain 中自带的记忆上实现

# 使用 sqlite 作为示例
def get_session(session_id):
    async_engine = create_async_engine("sqlite+aiosqlite:///memory.db")
    async_message_history = SQLChatMessageHistory(
        session_id=session_id, connection=async_engine,
    )
    return async_message_history
​
​
​
# 该函数在用户每轮发起会话的时候检查
async def check_message_history_status(self,session_id) -> None:
    '''
    检查消息状态是否正确,如果不正确,则处理
    '''
    
    history_session = get_session(session_id)
    messages = await history_session.aget_messages()
    if not messages:
        return
​
    last_message = messages[-1]
    if isinstance(last_message, AIMessage) and last_message.tool_calls:
        need_add_messages = []
        for command in last_message.tool_calls:
            item = ToolMessage(content="工具执行出错,请等待用户的下一步指令", tool_call_id=command['id'])
            need_add_messages.append(item)
​
        res = await history_session.aadd_messages(need_add_messages)
        print(res)
​
        return
​

License:  CC BY 4.0
Share

Further Reading

OLDER

使用 claude api遇到的问题

NEWER

Recently Updated

  • agent会话中用户主动暂停消息的处理方案
  • 使用 claude api遇到的问题
  • 一些开发中使用的 linux运维命令
  • python包管理神器:UV
  • ollama-大模型的部署与使用

Trending Tags

Halo 运维 postgresql 设计模式 linux就该这么学 nas rag odoo python 文本切分

Contents

©2025 刘刚刚的blog. Some rights reserved.

Using the Halo theme Chirpy