使用AI代理构建药物研发智能助手

本文详细介绍如何利用开源Strands Agents SDK和某中心Bedrock构建药物研发智能助手,包括多数据库检索、报告生成等技术实现方案,帮助研究人员快速获取科学文献和临床试验数据。

使用AI代理构建药物研发智能助手

药物研发是一个复杂且耗时的过程,研究人员需要查阅大量科学文献、临床试验数据和分子数据库。生命科学领域的机构正在使用AI代理和其他生成式AI工具来加速科学发现。这些组织的构建者已经使用某中心Bedrock的全托管功能快速部署特定领域的工作流,从早期药物靶点识别到医疗保健提供者参与等各种用例。

然而,更复杂的用例可能会受益于使用开源Strands Agents SDK。Strands Agents采用模型驱动的方法来开发和运行AI代理。它与大多数模型提供商兼容,包括自定义和内部大型语言模型(LLM)网关,代理可以部署在可以托管Python应用程序的任何地方。

解决方案概述

该解决方案使用Strands Agents连接高性能基础模型(FMs)与常见生命科学数据源(如arXiv、PubMed和ChEMBL)。它演示了如何快速创建MCP服务器来查询数据并在对话界面中查看结果。

小型、专注的AI代理协同工作通常比单个单体代理产生更好的结果。该解决方案使用一组子代理,每个子代理都有自己的FM、指令和工具。

技术实现

定义基础模型

首先使用Strands Agents BedrockModel类定义与某中心Bedrock中FM的连接。默认使用Anthropic的Claude 3.7 Sonnet模型:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from strands import Agent, tool
from strands.models import BedrockModel
from strands.agent.conversation_manager import SlidingWindowConversationManager
from strands.tools.mcp import MCPClient

def get_model():
    model = BedrockModel(
        boto_client_config=Config(
            read_timeout=900,
            connect_timeout=900,
            retries=dict(max_attempts=3, mode="adaptive"),
        ),
        model_id="us.anthropic.claude-3-7-sonnet-20250219-v1:0",
        max_tokens=64000,
        temperature=0.1,
        top_p=0.9,
        additional_request_fields={
            "thinking": {
                "type": "disabled"
            }
        }
    )
    return model

定义MCP工具

MCP提供了AI应用程序与其外部环境交互的标准。该解决方案为以下数据源提供示例MCP服务器:

  • arXiv - 学术文章开放存取库
  • PubMed - 生物医学文献同行评审引用
  • ChEMBL - 具有类药物特性的生物活性分子策划数据库
  • ClinicalTrials.gov - 美国政府的临床研究数据库
  • Tavily Web Search - 从公共互联网查找最新新闻和其他内容的API
1
2
3
4
5
6
7
# 各种科学数据库的MCP客户端
tavily_mcp_client = MCPClient(lambda: stdio_client(
    StdioServerParameters(command="python", args=["application/mcp_server_tavily.py"])
))
arxiv_mcp_client = MCPClient(lambda: stdio_client(
    StdioServerParameters(command="python", args=["application/mcp_server_arxiv.py"])
))

定义专业子代理

规划代理查看用户问题并创建使用哪些子代理和工具的计划:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
@tool
def planning_agent(query: str) -> str:
    """
    专门的分析研究查询并确定应使用哪些工具和数据库进行调查的规划代理
    """
    planning_system = """
    您是药物发现研究的专业规划代理。您的角色是:
    
    1. 分析研究问题以识别靶蛋白、化合物或生物机制
    2. 确定哪些数据库最相关(Arxiv、PubMed、ChEMBL、ClinicalTrials.gov)
    3. 为每个相关数据库生成特定的搜索查询
    4. 创建结构化的研究计划
    """
    model = get_model()
    planner = Agent(
        model=model,
        system_prompt=planning_system,
    )
    response = planner(planning_prompt)
    return str(response)

合成代理将来自多个来源的发现整合到单个综合报告中:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@tool
def synthesis_agent(research_results: str) -> str:
    """
    将研究发现合成为综合报告的专业代理
    """
    system_prompt = """
    您是药物发现研究的专业合成代理。您的角色是:
    
    1. 整合来自多个研究数据库的发现
    2. 创建全面、连贯的科学报告
    3. 突出关键见解、联系和机会
    4. 以结构化格式组织信息:
       - 执行摘要(300字)
       - 目标概述
       - 研究现状
       - 药物开发状态
       - 参考文献
    """
    model = get_model()
    synthesis = Agent(
        model=model,
        system_prompt=system_prompt,
    )
    response = synthesis(synthesis_prompt)
    return str(response)

定义编排代理

还定义了一个编排代理来协调整个研究工作流。该代理使用Strands Agents中的SlidingWindowConversationManager类来存储会话中的最后10条消息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
def create_orchestrator_agent(
    history_mode,
    tavily_client=None,
    arxiv_client=None,
    pubmed_client=None,
    chembl_client=None,
    clinicaltrials_client=None,
):
    system = """
    您是药物发现研究的编排代理。您的角色是协调多代理工作流:
    
    1. 协调阶段:
       - 对于简单查询:直接回答,不使用专业工具
       - 对于复杂的研究请求:启动多代理研究工作流
    
    2. 规划阶段:
       - 使用planning_agent确定要搜索的数据库及搜索查询
    
    3. 执行阶段:
       - 将专门的搜索任务路由到相应的研究代理
    
    4. 合成阶段:
       - 使用synthesis_agent将发现整合到综合报告中
       - 在适当时生成PDF报告
    """
    # 聚合来自专业代理和MCP客户端的所有工具
    tools = [planning_agent, synthesis_agent, generate_pdf_report, file_write]
    
    # 从每个MCP客户端动态加载工具
    if tavily_client:
        tools.extend(tavily_client.list_tools_sync())
    
    conversation_manager = SlidingWindowConversationManager(
        window_size=10,  # 维护最后10次交换的上下文
    )
    
    orchestrator = Agent(
        model=model,
        system_prompt=system,
        tools=tools,
        conversation_manager=conversation_manager
    )
    return orchestrator

示例用例:探索最近的乳腺癌研究

要测试新助手,请运行streamlit run application/app.py启动聊天界面,并在Web浏览器中打开本地URL(通常为http://localhost:8501)。

当询问助手"请生成包含最新新闻、近期研究、相关化合物和正在进行临床试验的HER2报告"时,助手首先使用其可用的各种工具制定全面的研究计划。它决定从搜索有关HER2的最新新闻开始,以及在PubMed和arXiv上的科学文章。它还查看ChEMBL中与HER2相关的化合物和正在进行的临床试验,将这些结果合成为单个报告,并生成包含引文的发现输出文件。

总结

本文展示了Strands Agents如何简化强大、特定领域AI助手的创建。Strands Agents的编排能力、流式响应和灵活配置与某中心Bedrock的强大语言模型相结合,为AI辅助研究创造了新的范式。随着科学信息量的持续指数级增长,像Strands Agents这样的框架将成为药物发现的重要工具。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计