关于 IntraIntel.ai - Multi-LLM Agent Coding Challenge
CliniSearch 是一个用 Python 构建的多 LLM 医疗问答 Agent,分别整合网页搜索和 PubMed 结果生成答案。它可选地优化查询、概述摘要片段,并提供来源链接。
主要功能
- 01网页与 PubMed 搜索
- 02可选查询优化
- 03可选摘要片段概述
- 04按来源分别生成答案
- 05结果附带来源链接
适用场景
- 01对照医疗网页搜索与 PubMed 结果
- 02依据检索到的来源片段生成答案
MCP 相关
Agent 通过自定义的 HTTP JSON 协议查询网页搜索和 PubMed 工具服务。服务返回结构化搜索结果,供后续合成答案。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
CliniSearch - 医疗搜索多 LLM Agent
本项目使用 Python 实现了一个多 LLM Agent 系统,用于回答医疗问题。它采用自定义的模型上下文协议(MCP),与不同的工具服务交互,以检索信息(网页搜索和 PubMed 搜索)。核心 Agent 借助 Hugging Face Inference API 中的多个免费大语言模型(LLM),执行查询优化、上下文片段摘要和最终答案综合等任务,并采用检索增强生成(RAG)方法。系统会根据从网页搜索和 PubMed 检索到的上下文,分别提供综合答案,并附上原始资料的链接。
视频演示链接
https://youtu.be/JvFvCYFYpzU?si=Vho8MM5Dy7YQk53E
系统架构
使用 Hugging Face API 免费层中的两个 LLM 模型:distillbart 和 mistral instruct
核心方法与设计
系统采用多步骤的 Agentic RAG 流程:
- 用户输入: Agent 接收用户提出的医疗问题。
- (可选)查询优化(LLM1): 可以将用户的问题交给第一个 LLM(例如
mistralai/Mistral-7B-Instruct-v0.3),生成更简洁、更有效的搜索查询,并聚焦于关键医疗术语。 - 信息检索(MCP 工具):
- 将(可能经过优化的)搜索查询发送至一个或两个 MCP 工具服务:
- 网页搜索 MCP 服务: 使用
duckduckgo-search搜索通用网页。 - PubMed MCP 服务: 使用
BioPython的 Entrez 工具查询 PubMed 数据库。
- 网页搜索 MCP 服务: 使用
- 这些服务会返回结构化的搜索结果(标题、摘要、URL/ID)。
- 将(可能经过优化的)搜索查询发送至一个或两个 MCP 工具服务:
- 上下文处理:
- (可选)摘要片段(LLM2): 如果搜索结果的摘要较长,可以将其交给专门的摘要 LLM(例如
sshleifer/distilbart-cnn-6-6),生成更简洁的版本。 - 上下文格式化: 将各来源(网页搜索、PubMed)的摘要片段(已摘要或原始内容)分别整理为结构化的上下文字符串。上下文中的每个条目都会标注标签(例如“条目 1”),并包含标题、内容和引用(URL 或 PubMed ID)。
- (可选)摘要片段(LLM2): 如果搜索结果的摘要较长,可以将其交给专门的摘要 LLM(例如
- 答案综合(LLM3 - RAG):
- 对于每个信息来源(网页搜索、PubMed),Agent 会分别调用功能强大的指令微调 LLM(例如
mistralai/Mistral-7B-Instruct-v0.3)。 - 提供给该 LLM 的提示词包括:
- 用户的原始问题。
- 来自该特定来源的格式化上下文。
- 一条指令,要求仅根据提供的上下文作答,并尽可能引用条目编号。
- 该 LLM 会为相应来源生成综合答案。
- 对于每个信息来源(网页搜索、PubMed),Agent 会分别调用功能强大的指令微调 LLM(例如
- 输出: 系统会先显示原始问题,随后显示基于网页搜索生成的综合答案(附来源链接),再显示基于 PubMed 生成的综合答案(附来源链接)。
关键技术:
- 使用
asyncio实现并发的 Python 3.9+。 - FastAPI 和 Uvicorn: 用于构建异步 MCP 工具服务。
httpx: 用于 Agent 向 MCP 服务和 Hugging Face API 发送异步 HTTP 请求。- Hugging Face Inference API: 用于访问免费的 LLM,以执行查询优化、摘要和答案综合。
duckduckgo-search: 用于无需 API 密钥的网页搜索。BioPython: 用于查询 NCBI 的 PubMed 数据库。python-dotenv: 用于管理 API 密钥和环境变量。
Model Context Protocol (MCP) 定义
本项目使用的 MCP 是一种基于 HTTP 的简单 JSON 协议,用于主 Agent 与工具服务之间的通信:
- 向 MCP 服务发送请求:
- 端点:
POST /execute - JSON 请求体:
{"query": "user's search query string"}
- 端点:
- MCP 服务的响应:
- JSON 请求体(成功):
{ "source": "server_name_string (e.g., WebSearchServer, PubMedServer)", "status": "success", "results": [ { "title": "string", "snippet": "string", "url": "string_url_if_web_search", // or missing "id": "string_pubmed_id_if_pubmed" // or missing } // ... more results ] } - JSON 请求体(错误):
{ "source": "server_name_string", "status": "error", "error_message": "string_describing_the_error" }
- JSON 请求体(成功):
设置说明
-
克隆/下载:
- 获取项目文件,并将其放入名为
intra_intel_multi_llm_challenge的目录中。
- 获取项目文件,并将其放入名为
-
创建并激活 Python 虚拟环境:
- 进入项目根目录(
intra_intel_multi_llm_challenge)。 - 创建环境:
python -m venv venv - 激活环境:
- 在 macOS/Linux 上:
source venv/bin/activate - 在 Windows 上:
venv\Scripts\activate
- 在 macOS/Linux 上:
- 进入项目根目录(
-
安装依赖项:
pip install -r requirements.txt -
配置环境变量:
- 在项目根目录中,将文件
.env.example复制为名为.env的新文件。 - 打开
.env文件并填写相关信息:# .env HF_API_TOKEN="your_huggingface_api_token_here" NCBI_EMAIL="[email protected]"HF_API_TOKEN: 在 Hugging Face 账户设置中获取此令牌(https://huggingface.co/settings/tokens)。拥有read权限的令牌即可。NCBI_EMAIL: 提供你的电子邮箱地址,以便通过 Entrez 礼貌地以程序方式访问 NCBI 的 PubMed 数据库。本项目无需事先在 NCBI 注册此邮箱。
- 在项目根目录中,将文件
-
接受受限模型的条款(Mistral 尤其重要):
- 默认使用的文本生成大模型为
mistralai/Mistral-7B-Instruct-v0.3。这是一个受限模型。 - 在 Hugging Face 网站上登录你的账户。
- 前往模型卡页面:https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.3
- 阅读并接受许可条款,以获得此模型的访问权限。随后,你的
HF_API_TOKEN将获准使用该模型。如果跳过此步骤,对该模型的 API 调用将会失败。
- 默认使用的文本生成大模型为
运行系统
在主 Agent 查询 MCP 服务之前,必须先启动这些服务。
-
终端 1:启动 Web Search MCP 服务:
- 切换到项目根目录(
intra_intel_multi_llm_challenge)。 - 确保已激活虚拟环境。
- 运行:
python -m uvicorn mcp_servers.web_search_server:app --reload --port 8001 - 等待出现 Uvicorn 正在运行的提示(例如,
Uvicorn running on http://0.0.0.0:8001)。
- 切换到项目根目录(
-
终端 2:启动 PubMed MCP 服务(用于附加功能):
- 切换到项目根目录。
- 确保已激活虚拟环境。
- 运行:
python -m uvicorn mcp_servers.pubmed_search_server:app --reload --port 8002 - 等待 Uvicorn 启动确认信息。
-
终端 3:运行主 Agent:
- 切换到项目根目录。
- 确保已激活虚拟环境。
- 运行:
python agent/main_agent.py - Agent 将处理预先定义的 5 个医学问题。对于每个问题,它将:
- 使用 LLM1(可选)优化查询。
- 查询 Web Search MCP 服务。
- 使用 LLM2(可选)总结网页搜索摘要。
- 根据网页搜索上下文,使用 LLM3 综合得出答案。
- 打印基于网页搜索的答案及其来源链接。
- 查询 PubMed MCP 服务(示例中
use_pubmed_for_this_question默认设为True)。 - 使用 LLM2(可选)总结 PubMed 摘要。
- 根据 PubMed 上下文,使用 LLM3 综合得出答案。
- 打印基于 PubMed 的答案及其来源链接。
- 处理每个问题之间会暂停一段时间,以避免对 Hugging Face API 速率限制造成影响。
关于 Hugging Face API 模型加载的说明: 首次通过 Inference API 调用 LLM 时,Hugging Face 可能需要先加载模型,这可能需要 20-90 秒(Mistral-7B 等较大的模型可能需要更长时间)。后续调用通常会更快。脚本设置了超时,并会尝试处理模型加载提示信息。
自定义和调试
- LLM 选择: 如果发现其他模型在 Hugging Face 免费 Inference API 上效果更好或可用性更稳定,可以在
agent/main_agent.py中更改VERIFIED_INSTRUCT_MODEL_ID和SUMMARIZATION_MODEL_ID(请务必先在模型卡片页面的小组件中验证!)。 - 切换功能: 在
agent/main_agent.py的if __name__ == "__main__":代码块中,可以更改传递给main_agent_workflow的refine_queries和summarize_snippets布尔标志,以测试启用或禁用这些步骤时的工作流。也可以针对单次调用更改use_pubmed_for_this_question。 - 详细日志: 如需查看详细的调试信息(API 负载、完整上下文等):
- 打开
agent/main_agent.py。 - 将
LOG_LEVEL = logging.INFO更改为LOG_LEVEL = logging.DEBUG。 - 保存并重新运行 Agent。
- 打开
依赖项
主要依赖项列于 requirements.txt 中:
fastapi:用于构建 MCP 服务。uvicorn[standard]:FastAPI 的 ASGI 服务端。httpx:用于发送异步 HTTP 请求。duckduckgo-search:用于网页搜索功能。biopython:用于通过 NCBI Entrez 查询 PubMed。python-dotenv:用于管理环境变量。
本 README 涵盖了理解、设置和运行项目所需的信息。
医学问题输出示例截图
网页搜索
Pubmed 搜索
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。