agent会话中用户主动暂停消息的处理方案
背景:
在用户与 agent聊天的时候,用户可能主动暂停当前轮次的对话,然后重新向大模型发送消息。
用户暂停会话可能带来的风险:如果此时刚好 agent发送完工具调用的指令,工具未执行完成。那么在用户的下一轮对话时,因为未响应大模型的工具调用结果,可能导致大模型调用报错。
初步调研
简单看了几个厂家大模型对话暂停的处理方案(非 agent场景):
deepseek会删除当前轮次的对话
gemini则还会保留当前的会话
处理方案
在这种场景下,用户在下一轮对话前,程序需要对历史消息进行检查,以防止报错。
检查的方案:
如果最后一条消息没有 ai 的工具调用,那么删除和不删除都不会影响程序的正常执行,这种情况无需处理。
如果最后一条历史消息中包含工具调用,那么可以考虑:
删除当次的会话:需要注意的是,当前轮次涉及到的多条消息,都需要删除掉。
主动拼接工具的返回:通过消息告诉大模型工具调用失败(实现见后续)
## 主动拼接工具回复的代码示例
以下代码在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