Skip to content

fix: 修正第 8 章情景记忆示例未使用 query 参数的问题 - #170

Merged
webup merged 2 commits into
datawhalechina:mainfrom
ryukirin:fix/ch08-search-past-conversations
Oct 27, 2026
Merged

webup merged 2 commits into
datawhalechina:mainfrom
ryukirin:fix/ch08-search-past-conversations

Conversation

@ryukirin

Copy link
Copy Markdown
Contributor

#169

问题

第八章的「情景记忆」中的 search_past_conversations(query, runtime) 没有使用 query,只按 user_id 取 5 个线程,再用 get_history() 返回检查点列表。官方文档 Memory 页面的示例也是这样写的。「后台记忆整合」中的 search_recent_conversations 同样声明了 query,但没有使用。

修改

search_past_conversations 加了一个关键词匹配的实现,不知道合适不合适,希望能给一些意见

  • search_past_conversations:先检查关键词,为空时返回提示,让模型带上关键词重新调用。仍取 5 个线程,并显式按更新时间倒序排列(接口文档没有规定默认顺序)。用 get_state() 读取当前消息,按关键词做字面匹配,跳过当前线程,最多返回 10 条、每条截取 300 个字符。工具说明里提示模型找不到时换用其他关键词。代码后补充一段说明。
  • search_recent_conversations:去掉没有使用的 query 参数

验证

在同一环境下运行修改后的两个代码块(<DEPLOYMENT_URL> 替换为本地地址,langchain 1.4.3)。换成较新的 langgraph-api 0.16.7,问题复现和修改后的结果都相同。工具函数用模拟的 ToolRuntime(context.user_id 和 config 中的 thread_id)直接调用,没有经过模型:

search_past_conversations 模型看到的参数: ['query']
search_recent_conversations 模型看到的参数: []
search_past_conversations('KeyError') → 只返回 KeyError 线程中的 2 条消息,不含当前线程和其他用户
search_past_conversations('爬山')     → 只返回爬山线程中的 2 条消息
search_past_conversations('xyz')      → 没有找到包含“xyz”的过去对话。
search_past_conversations('')         → query 不能为空,请传入要查找的关键词后重新调用。
search_recent_conversations()         → 返回该用户的 4 个线程,不含其他用户

另外在 create_deep_agent 的真实运行中确认,工具内的 runtime.config["configurable"]["thread_id"] 是当前线程编号。

npm run build 完成(21 page(s) built,Complete!)。

@webup

webup commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator

感谢 @ryukirin 发现问题并提供修正!让 query 参与关键词匹配、用 get_state() 避免重复返回检查点,以及去掉后台整合工具的无效参数,这些调整都合适。

合并前请再完善 search_past_conversations 的两处处理:

  1. 围绕命中位置截取上下文:目前固定返回 content[:300]。如果关键词和解决方法出现在第 300 字之后,虽然搜索命中,返回结果却不包含相关内容。建议保留长度限制,但根据关键词的位置截取附近文本。
  2. 先提取正文,再进行匹配:content 也可能是内容块列表,直接 str(content) 会把格式字段一起搜索。例如 [{"type": "text", "text": "数据库连接已修复"}] 会被关键词 text 误命中。建议统一提取字符串和文本块的正文,跳过非文本块及格式字段,再做匹配和截断。可参考官方消息格式说明。

补充覆盖这两个场景即可,保持示例简洁,无需扩展成复杂的检索实现。再次感谢你的贡献!

@ryukirin

Copy link
Copy Markdown
Contributor Author

非常感谢 @webup 的修改建议!
已按两点建议修改:

  1. 围绕命中位置截取上下文:先用 find 定位关键词,再以它为中心截取 300 个字符(前后各 150 个),注释里说明可以调整偏移量来偏向前文或后文。
  2. 先提取正文,再进行匹配:用 convert_to_messages() 把 SDK 返回的字典转成消息对象,再取 .text,只保留文本块的正文,图片、reasoning 等内容块和 type 等格式字段不参与匹配。

验证:

  1. 关键词在正文第 425 个字符处,返回的片段包含其后的解决方法。
  2. 内容块列表 [{"type": "text", "text": "数据库连接已修复"}, {"type": "image", ...}],搜索 text、example.com 不再误命中,搜索“数据库”返回“数据库连接已修复”。

npm run build 通过。

@webup

webup commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator

感谢 @ryukirin 的补充和细致修正!检索片段和消息正文的处理都已完善,复评通过,准备合并。感谢你的贡献!

@webup
webup merged commit 254e210 into datawhalechina:main Oct 27, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants