DeepMedical周报:PubMed摘要搜索工具集成与优化
一、项目背景
为提升DeepMedical智能体在医学文献检索和信息整合方面的能力,我们对PubMed摘要搜索工具的集成与使用进行了深入优化。目标是让researcher agent能够高效、准确地利用PubMed等权威数据库,自动获取、筛选和整合医学文献摘要,提升最终输出的专业性和权威性。
二、本周主要工作内容
本周主要完成了PubMed摘要搜索工具在DeepMedical系统中的集成与多轮优化,提升了医学文献检索的准确性与系统智能化水平。重点包括自动翻译、Agent工作流协同、摘要召回与排序等方面。
1. 工具集成与接口标准化
- 设计并实现了
fast_abstract_tool
,用于快速检索PubMed等数据库中的文献摘要。 - 优化了工具的输入输出接口,确保与agent系统的无缝集成。
- 增加了对异常情况(如无结果、网络异常等)的容错处理,提升了系统稳定性。
2. researcher agent调用逻辑优化
- 明确了researcher agent在处理医学相关问题时,优先调用摘要搜索工具。
- 通过prompt工程,规范了researcher的任务分解与摘要信息整合流程。
- 支持自动根据用户查询内容动态选择合适的检索关键词,提高检索相关性。
- 在多轮推理链中,确保摘要工具调用与后续内容综合分析的衔接。
3. 工作流与节点调整
- 结合实际需求,调整了agent工作流节点的连接方式,确保摘要工具在合适的阶段被调用。
- 通过日志与调试,定位并修复了因节点路由导致的摘要工具未被调用的问题。
- 对翻译节点与research节点的衔接进行了优化,保证非英文输入也能先被翻译再进行摘要检索。
4. 测试与效果验证
- 设计并执行了多组医学检索场景测试用例,包括常见疾病、治疗方案、药物等方向。
- 验证了摘要工具在不同输入场景下的准确性、召回率与系统健壮性。
- 收集并分析了用户反馈,不断优化工具调用策略和输出内容。
三、遇到的问题与解决方案
1. 节点未正确调用摘要工具
问题现象:
初期在多Agent协作流程中,researcher agent未能自动调用摘要工具,导致检索任务未被正确执行。
原因分析:
- 工作流节点连接顺序存在缺陷,摘要工具未被纳入关键路径。
- 节点间状态传递不规范,部分上下文信息丢失。
解决方法:
- 在
graph/builder.py
中调整节点连接,确保researcher agent在合适阶段调用摘要工具。 - 明确
state
结构,统一数据传递格式。
关键代码片段:
# graph/builder.py
workflow.add_node("coordinator", coordinator_node)
workflow.add_node("translator", translator_node)
workflow.add_node("planner", planner_node)
workflow.add_node("researcher", researcher_node)
workflow.connect("coordinator", "translator")
workflow.connect("translator", "planner")
workflow.connect("planner", "researcher")
2. 输入多语言适配
问题现象:
用户直接输入中文时,摘要检索失败。
原因分析:
- 未自动检测并翻译非英文输入,导致下游英文检索工具无法正确处理。
解决方法:
- 实现
translator_node
,自动检测并翻译中文。 - 修改
coordinator_node
逻辑,优先跳转至翻译节点。
关键代码片段:
# graph/nodes.py
def coordinator_node(state: State) -> Command[Literal["planner", "translator", "__end__"]]:
user_input = state.get("user_input", "")
if contains_chinese(user_input):
return Command(next="translator", state=state)
else:
return Command(next="planner", state=state)
3. 接口异常与健壮性
问题现象::摘要工具在遇到无结果或网络异常时,系统报错或中断。
原因分析::缺乏异常处理和日志记录,影响系统稳定性。
解决方法::在工具实现中增加异常捕获与日志输出,提升容错能力。
关键代码片段:
# tools/fast_abstract_tool.py
def fast_abstract_search(query: str) -> List[Dict]:
try:
results = keyword_search(query)
sorted_results = semantic_sort(results, query)
return sorted_results
except Exception as e:
logger.error(f"Abstract search error: {e}")
return []
四、后续计划
- 深化与更多医学数据库的集成,提升多源信息整合能力。
- 优化摘要工具的召回与排序算法,提升检索相关性。
- 完善自动测试用例,持续监控工具效果。
- 结合用户反馈,进一步优化prompt与agent协作流程。