<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Justin Castilla - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Justin Castilla - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/cn/search-labs/author/justin-castilla</link>
    </image>
    <link>https://www.elastic.co/cn/search-labs/author/justin-castilla</link>
    <atom:link href="https://www.elastic.co/cn/search-labs/rss/author/justin-castilla.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[cn]]></language>
    <lastBuildDate>Wed, 23 Sep 2026 01:49:08 GMT</lastBuildDate>
  <item>
    <title><![CDATA[在 Elasticsearch 中使用 A2A 协议和 MCP 创建 LLM 代理新闻室：第二部分]]></title>
    <description><![CDATA[了解如何使用 A2A 协议（用于代理协作）和 MCP（用于 Elasticsearch 中的工具访问）建立专门的混合 LLM 代理新闻室。]]></description>
    <content:encoded><![CDATA[<h2>A2A 和 MCP：行动守则</h2><p>本文是 "在 Elasticsearch 中使用 A2A 协议和 MCP 创建 LLM 代理新闻室！"一文的配套文章，该文章介绍了在同一个代理中同时实施 A2A 和 MCP 架构的好处，以真正获得这两种框架的独特优势。如果您希望自行运行演示，我们还提供了一个<a href="https://github.com/justincastilla/elastic-newsroom">资源库</a>。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt232e466d2153c764/6a17f15f631730042d585b8d/7196f004089127f83547b2e5dc3f663205cfcdce-1162x1600.png" alt="A2A&amp; MCP 协议代理工作流程" /><p>让我们来看看我们的新闻室代理是如何使用 A2A 和 MCP 协作来制作一篇新闻文章的。可<a href="https://github.com/justincastilla/elastic-newsroom">在此处</a>查看随附的存储库，了解代理的运行情况。</p><h3>步骤 1：故事任务</h3><p><strong>新闻主管</strong>（作为客户）指定一篇报道：</p>{
  "message_type": "task_request",
  "sender": "news_chief",
  "receiver": "reporter_agent",
  "payload": {
    "task_id": "story_renewable_energy_2024",
    "assignment": {
      "topic": "Renewable Energy Adoption in Europe",
      "angle": "Policy changes driving solar and wind expansion",
      "target_length": 1200,
      "deadline": "2025-09-30T18:00:00Z"
    }
  }
}<h3>第 2 步：记者要求进行研究</h3><p><strong>报告代理</strong>认识到它需要背景信息，并通过 A2A 委托给<strong>研究代理</strong>：</p>{
  "message_type": "task_request",
  "sender": "reporter_agent",
  "receiver": "researcher_agent",
  "payload": {
    "task_id": "research_eu_renewable_2024",
    "parent_task_id": "story_renewable_energy_2024",
    "capability": "fact_gathering",
    "parameters": {
      "queries": [
        "EU renewable energy capacity 2024",
        "Solar installations growth Europe",
        "Wind energy policy changes 2024"
      ],
      "depth": "comprehensive"
    }
  }
}<h3>第 3 步：报告人请求存档代理提供历史背景信息</h3><p><strong>记者代理</strong>认识到，历史背景会加强故事性。它通过 A2A 委托<strong>档案代理</strong>（由<a href="https://www.elastic.co/docs/solutions/search/elastic-agent-builder">Elastic 的 A2A 代理</a>提供支持）搜索新闻编辑室由 Elasticsearch 支持的文章档案：</p>{
  "message_type": "task_request",
  "sender": "reporter_agent",
  "receiver": "archive_agent",
  "payload": {
    "task_id": "archive_search_renewable_2024",
    "parent_task_id": "story_renewable_energy_2024",
    "capability": "search_archive",
    "parameters": {
      "query": "European renewable energy policy changes and adoption trends over past 5 years",
      "focus_areas": ["solar", "wind", "policy", "Germany", "France"],
      "time_range": "2019-2024",
      "result_count": 10
    }
  }
}<h3>步骤 4：归档代理使用带有 MCP 的弹性 A2A 代理</h3><p><strong>存档代理</strong>使用 Elastic 的 A2A 代理，而 A2A 代理又使用 MCP 访问 Elasticsearch 工具。这展示了混合架构，其中 A2A 实现了代理协作，而 MCP 提供了工具访问：</p># Archive Agent using Elastic A2A Agent
async def search_historical_articles(self, query_params):
    # The Archive Agent sends a request to Elastic's A2A Agent
    elastic_response = await self.a2a_client.send_request(
        agent="elastic_agent",
        capability="search_and_analyze",
        parameters={
            "natural_language_query": query_params["query"],
            "index_pattern": "newsroom-articles-*",
            "filters": {
                "topics": query_params["focus_areas"],
                "date_range": query_params["time_range"]
            },
            "analysis_type": "trend_analysis"
        }
    )
    
    # Elastic's A2A Agent internally uses MCP tools:
    # - platform.core.search (to find relevant articles)
    # - platform.core.generate_esql (to analyze trends)
    # - platform.core.index_explorer (to identify relevant indices)
    
    return elastic_response<p><strong>存档代理</strong>从 Elastic 的 A2A 代理接收全面的历史数据，并将其返回给报告器：</p>{
  "message_type": "task_response",
  "sender": "archive_agent",
  "receiver": "reporter_agent",
  "payload": {
    "task_id": "archive_search_renewable_2024",
    "status": "completed",
    "archive_data": {
      "historical_articles": [
        {
          "title": "Germany's Energiewende: Five Years of Solar Growth",
          "published": "2022-06-15",
          "key_points": [
            "Germany added 7 GW annually 2020-2022",
            "Policy subsidies drove 60% of growth"
          ],
          "relevance_score": 0.94
        },
        {
          "title": "France Balances Nuclear and Renewables",
          "published": "2023-03-20",
          "key_points": [
            "France increased renewable target to 40% by 2030",
            "Solar capacity doubled 2021-2023"
          ],
          "relevance_score": 0.89
        }
      ],
      "trend_analysis": {
        "coverage_frequency": "EU renewable stories increased 150% since 2019",
        "emerging_themes": ["policy incentives", "grid modernization", "battery storage"],
        "coverage_gaps": ["Small member states", "offshore wind permitting"]
      },
      "total_articles_found": 47,
      "search_confidence": 0.91
    }
  }
}<p>这一步骤演示了 Elastic 的 A2A Agent 如何集成到新闻编辑室的工作流程中。Archive Agent（新闻编辑室专用代理）与 Elastic 的 A2A Agent（第三方专家）协调，以利用 Elasticsearch 强大的搜索和分析功能。Elastic 的代理在内部使用 MCP 访问 Elasticsearch 工具，显示了代理协调 (A2A) 和工具访问 (MCP) 之间的明确分离。</p><h3>步骤 5：研究人员使用 MCP 服务器</h3><p><strong>研究员代理</strong>访问多个 MCP 服务器以收集信息：</p># Researcher Agent using MCP to access tools
async def gather_facts(self, queries):
    results = []
    
    # Use News API MCP Server
    news_data = await self.mcp_client.invoke_tool(
        server="news_api_mcp",
        tool="search_articles",
        parameters={
            "query": queries[0],
            "date_range": "2024-01-01 to 2024-09-30",
            "sources": ["reuters", "bloomberg", "euractiv"]
        }
    )
    
    # Use Statistics MCP Server
    stats_data = await self.mcp_client.invoke_tool(
        server="eurostat_mcp",
        tool="get_energy_statistics",
        parameters={
            "metrics": ["solar_capacity_mw", "wind_capacity_mw"],
            "countries": ["EU27"],
            "year": 2024
        }
    )
    
    # Use Fact-Checking MCP Server
    verified_facts = await self.mcp_client.invoke_tool(
        server="factcheck_mcp",
        tool="verify_claims",
        parameters={
            "claims": [
                "EU solar capacity increased 40% in 2024",
                "Germany leads in wind installations"
            ]
        }
    )
    
    return self._synthesize_research(news_data, stats_data, verified_facts)<h3>步骤 6：研究人员将数据返回给报告人</h3><p><strong>研究员代理</strong>通过 A2A 发送综合研究结果：</p>{
  "message_type": "task_response",
  "sender": "researcher_agent",
  "receiver": "reporter_agent",
  "payload": {
    "task_id": "research_eu_renewable_2024",
    "status": "completed",
    "research_data": {
      "key_facts": [
        {
          "claim": "EU solar capacity reached 260 GW in 2024",
          "source": "Eurostat Q3 2024 Report",
          "confidence": 0.95,
          "verified": true
        },
        {
          "claim": "Germany installed 12 GW of wind capacity in 2024",
          "source": "German Federal Network Agency",
          "confidence": 0.92,
          "verified": true
        }
      ],
      "statistics": {
        "solar_growth_rate": "35%",
        "wind_growth_rate": "28%"
      },
      "sources_count": 15
    }
  }
}<h3>第 7 步：记者撰写文章</h3><p><strong>报告代理</strong>利用研究数据和自身的 LLM 能力撰写文章。在撰写过程中，记者使用 MCP 服务器获取样式和模板：</p># Reporter Agent writing with MCP assistance
async def write_article(self, research_data, assignment):
    # Get style guidelines via MCP
    style_guide = await self.mcp_client.get_resource(
        server="newsroom_mcp",
        resource="style://editorial/ap_style_guide"
    )
    
    # Get article template via MCP
    template = await self.mcp_client.get_resource(
        server="newsroom_mcp",
        resource="template://articles/news_story"
    )
    
    # Generate article using LLM + research + style
    draft = await self.llm.generate(
        prompt=f"""
        Write a news article following these guidelines:
        {style_guide}
        
        Using this template:
        {template}
        
        Based on this research:
        {research_data}
        
        Assignment: {assignment}
        """
    )
    
    # Self-evaluate confidence in claims
    confidence_check = await self._evaluate_confidence(draft)
    
    return draft, confidence_check<h3>第 8 步：信心不足引发重新研究</h3><p><strong>报告代理</strong>评估了其草稿，发现有一项索赔的可信度较低。它会向<strong>研究员代理</strong>发送另一个请求：</p>{
  "message_type": "collaboration_request",
  "sender": "reporter_agent",
  "receiver": "researcher_agent",
  "payload": {
    "request_type": "fact_verification",
    "claims": [
      {
        "text": "France's nuclear phase-down contributed to 15% increase in renewable capacity",
        "context": "Discussing policy drivers for renewable growth",
        "current_confidence": 0.45,
        "required_confidence": 0.80
      }
    ],
    "urgency": "high"
  }
}<p><strong>研究员</strong>使用事实核查 MCP 服务器核实索赔，并返回更新的信息：</p>{
  "message_type": "collaboration_response",
  "sender": "researcher_agent",
  "receiver": "reporter_agent",
  "payload": {
    "verified_claims": [
      {
        "original_claim": "France's nuclear phase-down contributed to 15% increase...",
        "verified_claim": "France's renewable capacity increased 18% in 2024, partially offsetting reduced nuclear output",
        "confidence": 0.88,
        "corrections": "Percentage was 18%, not 15%; nuclear phase-down is gradual, not primary driver",
        "sources": ["RTE France", "French Energy Ministry Report 2024"]
      }
    ]
  }
}<h3>第 9 步：记者修改并提交给编辑</h3><p><strong>记者</strong>将核实的事实纳入其中，并通过 A2A 将完成的草稿发送给<strong>编辑代理</strong>：</p>{
  "message_type": "task_request",
  "sender": "reporter_agent",
  "receiver": "editor_agent",
  "payload": {
    "task_id": "edit_renewable_story",
    "parent_task_id": "story_renewable_energy_2024",
    "content": {
      "headline": "Europe's Renewable Revolution: Solar and Wind Surge 30% in 2024",
      "body": "[Full article text...]",
      "word_count": 1185,
      "sources": [/* array of sources */]
    },
    "editing_requirements": {
      "check_style": true,
      "check_facts": true,
      "check_seo": true
    }
  }
}<h3>步骤 10：编辑使用 MCP 工具进行审查</h3><p><strong>编辑代理</strong>使用多个 MCP 服务器来审核文章：</p># Editor Agent using MCP for quality checks
async def review_article(self, content):
    # Grammar and style check
    grammar_issues = await self.mcp_client.invoke_tool(
        server="grammarly_mcp",
        tool="check_document",
        parameters={"text": content["body"]}
    )
    
    # SEO optimization check
    seo_analysis = await self.mcp_client.invoke_tool(
        server="seo_mcp",
        tool="analyze_content",
        parameters={
            "headline": content["headline"],
            "body": content["body"],
            "target_keywords": ["renewable energy", "Europe", "solar", "wind"]
        }
    )
    
    # Plagiarism check
    originality = await self.mcp_client.invoke_tool(
        server="plagiarism_mcp",
        tool="check_originality",
        parameters={"text": content["body"]}
    )
    
    # Generate editorial feedback
    feedback = await self._generate_feedback(
        grammar_issues, 
        seo_analysis, 
        originality
    )
    
    return feedback<p><strong>编辑</strong>批准文章并将其转发：</p>{
  "message_type": "task_response",
  "sender": "editor_agent",
  "receiver": "reporter_agent",
  "payload": {
    "status": "approved",
    "quality_score": 9.2,
    "minor_edits": [
      "Changed 'surge' to 'increased' in paragraph 3 for AP style consistency",
      "Added Oxford comma in list of countries"
    ],
    "approved_content": "[Final edited article]"
  }
}<h3>第 11 步：发布者通过 CI/CD 发布</h3><p>最后，<strong>打印机代理</strong>使用 CMS 和 CI/CD 管道的 MCP 服务器发布已批准的文章：</p># Publisher Agent publishing via MCP
async def publish_article(self, content, metadata):
    # Upload to CMS via MCP
    cms_result = await self.mcp_client.invoke_tool(
        server="wordpress_mcp",
        tool="create_post",
        parameters={
            "title": content["headline"],
            "body": content["body"],
            "status": "draft",
            "categories": metadata["categories"],
            "tags": metadata["tags"],
            "featured_image_url": metadata["image_url"]
        }
    )
    
    post_id = cms_result["post_id"]
    
    # Trigger CI/CD deployment via MCP
    deploy_result = await self.mcp_client.invoke_tool(
        server="cicd_mcp",
        tool="trigger_deployment",
        parameters={
            "pipeline": "publish_article",
            "environment": "production",
            "post_id": post_id,
            "schedule": "immediate"
        }
    )
    
    # Track analytics
    await self.mcp_client.invoke_tool(
        server="analytics_mcp",
        tool="register_publication",
        parameters={
            "post_id": post_id,
            "publish_time": datetime.now().isoformat(),
            "story_id": metadata["story_id"]
        }
    )
    
    return {
        "status": "published",
        "post_id": post_id,
        "url": f"https://newsroom.example.com/articles/{post_id}",
        "deployment_id": deploy_result["deployment_id"]
    }<p><strong>出版商</strong>确认通过 A2A 出版：</p>{
  "message_type": "task_complete",
  "sender": "printer_agent",
  "receiver": "news_chief",
  "payload": {
    "task_id": "story_renewable_energy_2024",
    "status": "published",
    "publication": {
      "url": "https://newsroom.example.com/articles/renewable-europe-2024",
      "published_at": "2025-09-30T17:45:00Z",
      "post_id": "12345"
    },
    "workflow_metrics": {
      "total_time_minutes": 45,
      "agents_involved": ["reporter", "researcher", "archive", "editor", "printer"],
      "iterations": 2,
      "mcp_calls": 12
    }
  }
}<p>下面是随附的资料库中使用上述相同代理的 A2A 工作流程的完整序列。</p><p>#</p><p>来自</p><p>至</p><p>行动</p><p>规程</p><p>描述</p><p>1</p><p>用户</p><p>新闻主管</p><p>指定故事</p><p>HTTP POST</p><p>用户提交故事主题和角度</p><p>2</p><p>新闻主管</p><p>内部</p><p>创建故事</p><p>-</p><p>创建具有唯一 ID 的故事记录</p><p>3</p><p>新闻主管</p><p>记者</p><p>代表任务</p><p>A2A</p><p>通过 A2A 协议发送故事任务</p><p>4</p><p>记者</p><p>内部</p><p>接受任务</p><p>-</p><p>内部存储任务</p><p>5</p><p>记者</p><p>MCP 服务器</p><p>生成大纲</p><p>MCP/HTTP</p><p>创建文章大纲和研究问题</p><p>6a</p><p>记者</p><p>研究员</p><p>申请研究</p><p>A2A</p><p>发送问题（与 6b 并行）</p><p>6b</p><p>记者</p><p>档案员</p><p>搜索档案</p><p>A2A JSONRPC</p><p>搜索历史文章（与 6a 并行）</p><p>7</p><p>研究员</p><p>MCP 服务器</p><p>研究问题</p><p>MCP/HTTP</p><p>通过 MCP 使用人类学来回答问题</p><p>8</p><p>研究员</p><p>记者</p><p>返回研究</p><p>A2A</p><p>返回研究答案</p><p>9</p><p>档案员</p><p>Elasticsearch</p><p>搜索索引</p><p>ES REST API</p><p>查询 news_archive 索引</p><p>10</p><p>档案员</p><p>记者</p><p>返回存档</p><p>A2A JSONRPC</p><p>返回历史搜索结果</p><p>11</p><p>记者</p><p>MCP 服务器</p><p>生成文章</p><p>MCP/HTTP</p><p>创建具有研究/档案背景的文章</p><p>12</p><p>记者</p><p>内部</p><p>商店草案</p><p>-</p><p>内部保存草稿</p><p>13</p><p>记者</p><p>新闻主管</p><p>提交草案</p><p>A2A</p><p>提交完成的草稿</p><p>14</p><p>新闻主管</p><p>内部</p><p>更新故事</p><p>-</p><p>存储草稿，将状态更新为"draft_submitted"</p><p>15</p><p>新闻主管</p><p>编辑</p><p>审查草案</p><p>A2A</p><p>自动路由至编辑器以供审核</p><p>16</p><p>编辑</p><p>MCP 服务器</p><p>评论文章</p><p>MCP/HTTP</p><p>通过 MCP 使用 Anthropic 分析内容</p><p>17</p><p>编辑</p><p>新闻主管</p><p>返回评论</p><p>A2A</p><p>发送编辑反馈和建议</p><p>18</p><p>新闻主管</p><p>内部</p><p>商店评论</p><p>-</p><p>存储编辑反馈</p><p>19</p><p>新闻主管</p><p>记者</p><p>应用编辑</p><p>A2A</p><p>将审查反馈意见转达给报告人</p><p>20</p><p>记者</p><p>MCP 服务器</p><p>应用编辑</p><p>MCP/HTTP</p><p>根据反馈意见修改文章</p><p>21</p><p>记者</p><p>内部</p><p>更新草案</p><p>-</p><p>对草案进行修订更新</p><p>220</p><p>记者</p><p>新闻主管</p><p>返回修订版</p><p>A2A</p><p>返回修订后的文章</p><p>23</p><p>新闻主管</p><p>内部</p><p>更新故事</p><p>-</p><p>存储修订草案，状态为"修订版"</p><p>24</p><p>新闻主管</p><p>出版商</p><p>发表文章</p><p>A2A</p><p>出版商自动路由</p><p>25</p><p>出版商</p><p>MCP 服务器</p><p>生成标签</p><p>MCP/HTTP</p><p>创建标记和类别</p><p>26</p><p>出版商</p><p>Elasticsearch</p><p>索引文章</p><p>ES REST API</p><p>将文章索引到 news_archive 索引</p><p>27</p><p>出版商</p><p>文件系统</p><p>保存标记</p><p>文件输入/输出</p><p>将文章保存为 .md文件在 /articles</p><p>28</p><p>出版商</p><p>新闻主管</p><p>确认出版</p><p>A2A</p><p>返回成功状态</p><p>29</p><p>新闻主管</p><p>内部</p><p>更新故事</p><p>-</p><p>将故事状态更新为"已发布"</p><h2>结论</h2><p>A2A 和 MCP 在现代增强型 LLM 基础设施范例中都可以发挥重要作用。A2A 为复杂的多代理系统提供了灵活性，但潜在的可移植性较差，操作复杂性较高。MCP 提供了一种标准化的工具集成方法，更易于实施和维护，但它并不是为处理多代理协调而设计的。</p><p>选择不是二元对立的。正如我们的新闻编辑室示例所示，最复杂、最有效的 LLM 支持系统往往将这两种方法结合在一起：代理通过 A2A 协议进行协调和专业化，同时通过 MCP 服务器访问其工具和资源。这种混合架构在提供多代理系统的组织优势的同时，还提供了 MCP 的标准化和生态系统优势。这表明可能根本不需要做出选择：只需将两者都作为标准方法使用即可</p><p>作为开发人员或架构师，您需要测试并确定这两种解决方案的最佳组合，从而为您的特定用例创造正确的结果。了解每种方法的优势、局限性和适当应用，将使您能够构建更有效、可维护和可扩展的人工智能系统。</p><p>无论您是要建立数字新闻编辑室、客户服务平台、研究助手，还是其他任何由 LLM 驱动的应用程序，仔细考虑您的协调需求 (A2A) 和工具访问要求 (MCP) 都将使您走上成功之路。</p><h2>其他资源</h2><ul><li><p><strong>Elasticsearch 代理生成器 </strong><a href="https://www.elastic.co/docs/solutions/search/elastic-agent-builder">：https://www.elastic.co/docs/solutions/search/elastic-agent-builder</a></p></li><li><p><strong>A2A 规格</strong> <a href="https://a2a-protocol.org/latest/specification/">： https://a2a-protocol.org/latest/specification/</a></p></li><li><p><strong>A2A 和 MCP 集成</strong> <a href="https://a2a-protocol.org/latest/topics/a2a-and-mcp/">：https://a2a-protocol.org/latest/topics/a2a-and-mcp/</a></p></li><li><p><strong>模型上下文协议</strong> <a href="https://modelcontextprotocol.io/">： https://modelcontextprotocol.io</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/a2a-protocol-mcp-llm-agent-workflow-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/a2a-protocol-mcp-llm-agent-workflow-elasticsearch</guid>
    <category><![CDATA[智能体 AI]]></category>
    <category><![CDATA[AI]]></category>
    <dc:creator><![CDATA[Justin Castilla]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1b1f22cdc2130333/6a17f161ec0f8917fa5a6712/f87330e5d4ca961593b3cfb861ca850a4cc34186-1519x1173.png" length="0" type="image/png"/>
    <pubDate>Mon, 24 Nov 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[在 Elasticsearch 中使用 A2A 协议和 MCP 创建 LLM Agent 新闻室：第一部分]]></title>
    <description><![CDATA[在一个实际的新闻编辑室案例中探索 A2A 协议和 MCP 的概念，在这个案例中，专门的 LLM 代理合作研究、撰写、编辑和发布新闻文章。]]></description>
    <content:encoded><![CDATA[<h2>引言</h2><p>当前由 LLM 支持的系统正在迅速发展，超越了单一模型应用，成为复杂的网络，其中专门的代理共同完成现代计算前所未有的任务。随着这些系统的复杂性不断增加，使代理通信和工具访问成为可能的基础设施成为开发的重点。为满足这些需求，出现了两种互补的方法：用于多代理协调的<strong>代理2代理（A2A）</strong>协议，以及用于标准化工具和资源访问的<strong>模型上下文协议（MCP）</strong>。</p><p>了解在什么情况下可以同时使用和不使用这两种方法，会对应用程序的可扩展性、可维护性和有效性产生重大影响。本文以数字新闻编辑室为例，探讨了<strong>A2A</strong>的概念和实现方法，在数字新闻编辑室中，专门的 LLM 代理合作研究、撰写、编辑和发布新闻文章。</p><p>我们将<a href="https://github.com/justincastilla/elastic-newsroom/tree/main">在</a>文章最后的第 5 部分探讨 A2A 的具体应用实例。</p><h3>准备工作</h3><p><a href="https://github.com/justincastilla/elastic-newsroom/tree/main">资源库</a>由 A2A 代理的 Python 实现组成。Flask 提供了一个 API 服务器，以及一个名为 Event Hub 的自定义 Python 消息传递服务，用于路由日志和 UI 更新消息。最后，还提供了一个 React UI，用于独立使用新闻编辑室的功能。所有内容都包含在一个 Docker 镜像中，以便于实施。如果您想直接在机器上运行服务，则需要确保安装了这些技术：</p><p>语言和运行时</p><ul><li><p>Python 13.12 - 核心后端语言</p></li><li><p>Node.js 18+ - 可选 React UI</p></li></ul><p>核心框架和 SDKS：</p><ul><li><p>A2A SDK 0.3.8 - Agent 协调与通信</p></li><li><p>Anthropic SDK--克劳德集成人工智能生成器</p></li><li><p>Uvicorn - 用于运行代理的 ASGI 服务器</p></li><li><p>FastMCP 2.12.5+ - MCP 服务器实施</p></li><li><p>React 18.2 - 前端用户界面框架</p></li></ul><p>数据&amp; 搜索</p><ul><li><p>Elasticsearch 9.1.1+- 文章索引和搜索</p></li></ul><p>Docker 部署（可选，但建议使用）</p><ul><li><p>Docker 28.5.1+</p></li></ul><h2>第 1 部分：什么是 Agent2Agent（A2A）？</h2><h3>定义和核心概念</h3><p>Agent2Agent(A2A) 是独立 LLM 代理 之间进行交互的标准化协议。A2A 不是由一个单一的系统来处理所有任务，而是让多个专业代理进行沟通、协调和协作，以完成复杂的工作流程，而这些工作流程对于任何单一代理来说都是难以高效处理、速度缓慢或根本不可能完成的。</p><p><strong>官方规格</strong> <a href="https://a2a-protocol.org/latest/specification/">：https://a2a-protocol.org/latest/specification/</a></p><h3>起源与进化</h3><p>Agent2Agent 通信或多代理系统的概念源于<a href="https://en.wikipedia.org/wiki/Multi-agent_system">几十年</a>前的分布式系统、微服务和多代理研究。分布式人工智能的早期工作为能够进行协商、协调和协作的代理奠定了基础。这些早期系统专门用于大规模<a href="https://www.jasss.org/5/1/7.html">社会模拟</a>、<a href="https://arxiv.org/html/2410.09403v1">学术研究</a>和<a href="https://www.researchgate.net/publication/334765661_Generation_Expansion_Planning_Considering_Investment_Dynamic_of_Market_Participants_Using_Multi-agent_System">电网管理</a>。</p><p>在谷歌和更广泛的人工智能研究界的支持下，随着 LLM 的出现和运行成本的降低，多代理系统开始进入 "专业消费者 "市场。现在，A2A 协议被称为 Agent2Agent 系统，它已发展成为一个现代标准，专为多个大型语言模型协调工作和任务的时代而设计。</p><p>A2A 协议将一致的标准和原则应用于 LLM 连接和通信的交互点，从而确保代理之间的无缝通信和协调。这种标准化使来自不同开发商、使用不同底层模型的代理能够有效地协同工作。</p><p>通信协议并非新生事物，在互联网上进行的几乎所有数字交易中都有广泛的应用。如果您键入<a href="https://www.elastic.co/search-labs">https://www.elastic.co/search-labs</a>在浏览器中访问这篇文章时，很有可能 TCP/IP、HTTP 传输和 DNS 查询协议都已执行，从而确保我们获得一致的浏览体验。</p><h3>主要特点</h3><p>A2A 系统建立在几个基本原则之上，以确保通信顺畅。以这些原则为基础，可以确保基于不同 LLM、框架和编程语言的不同代理都能无缝互动。</p><p>以下是四项主要原则：</p><ul><li><p><strong>信息传递</strong>：代理通过具有明确属性和格式的结构化信息进行通信</p></li><li><p><strong>协调</strong>：代理通过相互委派任务和管理依赖关系来协调复杂的工作流程，而不会阻塞其他代理</p></li><li><p><strong>专业化</strong>：每个代理都专注于某一特定领域或能力，成为该领域的专家，并根据技能组合完成任务</p></li><li><p><strong>分布式状态</strong>：状态和知识分布在各个代理之间，而不是集中在一起，代理之间能够相互更新任务状态和部分回报（工件）的进展情况</p></li></ul><h3>新闻编辑室运行范例</h3><p>试想一个由人工智能代理驱动的数字新闻编辑室，每个代理都擅长新闻业的不同方面：</p><ul><li><p><strong>新闻主管</strong>（协调员/客户）：分配报道任务并监督工作流程</p></li><li><p><strong>记者代理</strong>：根据研究和采访撰写文章</p></li><li><p><strong>研究员代理</strong>：收集事实、统计数据和背景信息</p></li><li><p><strong>档案代理</strong>：使用 Elasticsearch 搜索历史文章并确定趋势</p></li><li><p><strong>编辑代理</strong>：对文章的质量、风格和搜索引擎优化进行审核</p></li><li><p><strong>发布者代理</strong>：通过 CI/CD 将批准的文章发布到博客平台上</p></li></ul><p>当新闻主管指派一篇关于<em>可再生能源应用的</em>报道时，记者需要研究员收集统计数据，编辑需要审阅草稿，出版商需要出版最终稿件。这种协调是通过 A2A 协议进行的。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb6c7215a96326481/6a17f2dd445de953024d0243/cc0760dbd74c49b92fa00dafbb8c2e8740eb70b6-963x693.png" alt="" /><h2>第 2 节：了解 A2A 架构</h2><h3>客户代理和远程代理角色</h3><p>在 A2A 架构中，代理主要扮演两种角色。<strong>客户代理</strong>负责制定任务并将任务传达给系统中的其他代理。它能识别远程代理及其能力，并利用这些信息就任务授权做出明智的决策。客户代理负责协调整个工作流程，确保任务分配得当，系统朝着目标前进。</p><p>而<strong>远程代理</strong>则负责执行客户委托的任务。它根据请求提供信息或采取具体行动，但不会独立发起行动。远程代理还可以根据需要与其他远程代理进行通信，以履行其指定职责，从而创建一个具有专业能力的协作网络。</p><p>在我们的新闻编辑室，新闻主管充当客户代理，而记者、研究员、编辑和出版商则是远程代理，负责响应请求并相互协调。</p><h3>A2A 核心能力</h3><p>A2A 协议定义了几种实现多代理协作的功能：</p><h4>1.发现</h4><p>A2A 服务器必须公布其功能，以便客户知道何时以及如何利用它们完成特定任务。这可以通过描述代理能力、输入和输出的代理卡--JSON 文档来实现。代理卡在一致的知名端点（如推荐的<code>/.well-known/agent-card.json</code> 端点）上提供，允许客户在启动协作之前发现并查询代理的能力。</p><p>以下是 Elastic 定制存档代理"Archie Archivist" 的代理卡示例。请注意，Elastic 等软件提供商会托管其 A2A 代理，并提供一个 url 供访问：</p>{
  "name": "Archie Archivist",
  "description": "Helps find historical news documents in the Elasticsearch Index of archived news articles and content.",
  "url": "https://xxxxxxxxxxxxx-abc123.kb.us-central1.gcp.elastic.cloud/api/agent_builder/a2a/archive-agent",
  "provider": {
    "organization": "Elastic",
    "url": "https://elastic.co"
  },
  "version": "0.1.0",
  "protocolVersion": "0.3.0",
  "preferred_transport": "JSONRPC",
  "documentationURL": "https://www.elastic.co/docs/solutions/search/agent-builder/a2a-server"
  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "stateTransitionHistory": false
  },
  "skills": [
    {
      "id": "platform.core.search",
      "name": "platform.core.search",
      "description": "A powerful tool for searching and analyzing data within your Elasticsearch cluster.",
      "inputModes": ["text/plain", "application/json"],
      "outputModes": ["text/plain", "application/json"]
    },
    {
      "id": "platform.core.index_explorer",
      "name": "platform.core.index_explorer",
      "description": "List relevant indices, aliases and datastreams based on a natural language query.",
      "inputModes": ["text/plain", "application/json"],
      "outputModes": ["text/plain", "application/json"]
    }
  ],
  "defaultInputModes": ["text/plain"],
  "defaultOutputModes": ["text/plain"]
}<p>该代理卡揭示了 Elastic 档案代理的几个重要方面。该代理将自己定位为"Archie Archivist" ，并明确说明了自己的目的：帮助在 Elasticsearch 索引中查找历史新闻文档。该卡指定了提供商（Elastic）和协议版本（0.3.0），以确保与其他 A2A 兼容代理的兼容性。最重要的是，<code>skills</code> 数组列举了该代理提供的具体功能，包括强大的搜索功能和智能索引探索。每种技能都定义了它所支持的输入和输出模式，使客户能够准确了解如何与该代理进行通信。该代理源于 Elastic 的代理生成器服务，它提供了一套本地 LLM 支持的工具和 API 端点，用于与数据存储对话，而不仅仅是从存储中检索。可<a href="https://www.elastic.co/docs/solutions/search/agent-builder/a2a-server">在此处</a>访问 Elasticsearch 中的 A2A 代理。</p><h4>2.谈判</h4><p>客户和代理需要就交流方式达成一致--无论互动是通过文本、表单、iframe 还是音频/视频进行，以确保适当的用户互动和数据交换。这种协商发生在代理合作的开始阶段，并确立了整个工作流程中的交互协议。例如，语音客户服务代理可能会协商通过音频流进行通信，而数据分析代理可能更喜欢结构化的 JSON。谈判过程可确保双方以适合自身能力和当前任务要求的形式有效交换信息。</p><p>上述 JSON 代码段中列出的功能都有输入和输出模式；这些模式设定了如何与其他代理交互。</p><h4>3.任务和状态管理</h4><p>在整个任务执行过程中，客户端和代理需要有机制来交流任务状态、变化和依赖关系。这包括管理任务从创建、分配到进度更新和状态更改的整个生命周期。典型的状态包括待处理、进行中、已完成或失败状态。系统还必须跟踪任务之间的依赖关系，以确保在依赖任务开始之前完成前提工作。错误处理和重试逻辑也是必不可少的组成部分，可让系统从容地从故障中恢复，并继续朝着主要目标前进。</p><p>任务信息示例：</p>{
  "message_id": "msg_789xyz",
  "message_type": "task_request",
  "sender": "news_chief",
  "receiver": "researcher_agent",
  "timestamp": "2025-09-30T10:15:00Z",
  "payload": {
    "task_id": "task_456abc",
    "capability": "fact_gathering",
    "parameters": {
      "query": "renewable energy adoption rates in Europe 2024",
      "sources": ["eurostat", "iea", "ember"],
      "depth": "comprehensive"
    },
    "context": {
      "story_id": "story_123",
      "deadline": "2025-09-30T18:00:00Z",
      "priority": "high"
    }
  }
}<p>这个任务信息示例展示了 A2A 通信的几个关键方面。</p><ul><li><p><strong>信息结构</strong>包括元数据，如唯一的信息标识符、发送的信息类型、发送方和接收方标识，以及用于跟踪和调试的时间戳。</p></li><li><p><strong>有效载荷</strong>包含实际的任务信息，指明远程代理正在调用的功能，并提供执行该功能所需的参数。</p></li><li><p><strong>上下文</strong>部分提供了更多信息，帮助接收代理了解更广泛的工作流程，包括截止日期和优先级，告知代理应如何分配资源和安排工作。</p></li></ul><h4>4.合作</h4><p>客户端和代理<strong>必须</strong>支持动态但有条理的交互，使代理能够要求客户端、其他代理或用户提供说明、信息或子操作。这就创造了一个协作环境，代理可以在初始指令不明确时提出后续问题，要求提供更多的背景信息以做出更好的决策，将子任务委托给其他具有更合适专业知识的代理，并在继续执行完整任务之前提供中间结果以获得反馈。这种多向沟通可确保代理商不是孤立地工作，而是参与到持续的对话中，从而取得更好的成果。</p><h3>分布式点对点通信</h3><p>A2A 实现了分布式通信，其中代理可能由不同的组织托管，一些代理由内部维护，另一些则由第三方服务提供。这些代理可以在不同的基础设施上运行，可能跨越多个云提供商或内部数据中心。它们可能使用不同的底层 LLM，一些代理采用 GPT 模型，另一些采用 Claude 模型，还有一些采用开源替代模型。代理甚至可以跨越不同的地理区域运行，以符合数据主权要求或减少延迟。尽管存在这种多样性，但所有代理都同意使用共同的通信协议来交换信息，从而确保了互操作性，而不管实施细节如何。这种分布式架构为系统的构建和部署提供了灵活性，使企业能够根据自身的具体需求，混合和匹配最佳的代理和基础设施。</p><p>这就是新闻编辑室应用程序的最终架构：</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt74d59cd9267f54d8/6a17f2de505ac31129ad8c71/82e01a0d9746038eafd69d11177042b5390507ae-1600x838.png" alt="" /><h2>第 3 节：模型上下文协议（MCP）</h2><h3>定义和目的</h3><p>模型上下文协议（MCP）是 Anthropic 开发的一种标准化协议，旨在通过用户定义的工具、资源和提示，以及其他补充代码库增添的内容，来增强单个 LLM 的功能和能力。MCP 在语言模型和它们有效完成任务所需的外部资源之间提供了一个通用接口。<a href="https://www.elastic.co/search-labs/blog/mcp-current-state">本文</a>通过用例、新兴趋势和 Elastic 自身的实施，概述了 MCP 的现状。</p><h3>MCP 核心概念</h3><p>MCP 采用客户服务器架构，由三个主要部分组成：</p><ul><li><p><strong>客户端：</strong>连接到 MCP 服务器以访问其功能的应用程序（如 Claude Desktop 或自定义 AI 应用程序）。</p></li><li><p><strong>服务器</strong>：向语言模型提供资源、工具和提示的应用程序。每个服务器都专门提供对特定功能或数据源的访问。</p><ul><li><p><strong>工具</strong>：用户定义的函数，模型可调用这些函数进行操作，如搜索数据库、调用外部应用程序接口或对数据执行转换等。</p></li><li><p><strong>资源：</strong>模型可以读取的数据源，提供动态或静态数据，并通过 URI 模式访问（类似于 REST 路由）。</p></li><li><p><strong>提示： </strong>可重复使用的提示模板，带有变量，可指导模型完成特定任务。</p></li></ul></li></ul><h3>请求-响应模式</h3><p>MCP 采用熟悉的请求-响应交互模式，类似于 REST API。客户端（LLM）请求资源或调用工具，然后 MCP 服务器处理请求并返回结果，LLM 利用该结果继续执行任务。与点对点代理通信相比，这种带有外围服务器的集中模式提供了一种更简单的集成模式。</p><h3>新闻编辑室中的 MCP</h3><p>在我们的新闻编辑室示例中，各个代理使用 MCP 服务器访问他们需要的工具和数据：</p><ul><li><p><strong>研究员代理</strong>使用：</p><ul><li><p>新闻 API MCP 服务器（访问新闻数据库）</p></li><li><p>事实核查 MCP 服务器（根据可信来源核查声明）</p></li><li><p>学术数据库 MCP 服务器（学术文章和研究）</p></li></ul></li><li><p><strong>记者代理</strong>用途：</p><ul><li><p>风格指南 MCP 服务器（新闻编辑室写作标准）</p></li><li><p>模板 MCP 服务器（文章模板和格式）</p></li><li><p>图片库 MCP 服务器（图片库照片和图形）</p></li></ul></li><li><p><strong>编辑器代理</strong>使用：</p><ul><li><p>语法检查程序 MCP 服务器（语言质量工具）</p></li><li><p>剽窃检测 MCP 服务器（原创性验证）</p></li><li><p>搜索引擎优化分析 MCP 服务器（标题和关键词优化）</p></li></ul></li><li><p><strong>出版商代理</strong>使用：</p><ul><li><p>内容管理系统 MCP 服务器（内容管理系统 API）</p></li><li><p>CI/CD MCP 服务器（部署管道）</p></li><li><p>分析 MCP 服务器（跟踪和监控）</p></li></ul></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt195fe0bd36d36a48/6a17f2e0b1e113afe479f36c/b67311e3b58b27f9eb1b42a7b1dbad47ef3be4ad-808x535.png" alt="" /><h2>
第 4 部分：架构比较</h2><h3>何时使用 A2A</h3><p>A2A 架构在<strong>需要真正多代理协作的场景中</strong>表现出色。需要协调的多步骤工作流从 A2A 中受益匪浅，尤其是当任务涉及多个连续或并行步骤、需要迭代和改进的工作流以及需要检查点和验证的流程时。在我们的新闻编辑室示例中，报道工作流程要求记者撰写，但如果对某些事实的信心不足，可能需要返回研究员，然后再返回编辑，最后返回出版商。</p><p><strong>跨越多个领域的特定领域专业化</strong>是 A2A 的另一个强大用例。当需要不同领域的多位专家来完成一项更大的任务时，每个代理都会带来深厚的领域知识和针对不同方面的专门推理能力，A2A 提供了建立这些联系所需的协调框架。新闻编辑室完美地体现了这一点：研究员擅长信息收集，记者擅长写作，编辑擅长质量控制--每个人都有自己独特的专长。</p><p>对自主代理行为的需求使得 A2A 尤其有价值。在 A2A 架构中，能够<strong> 根据不断变化的条件做出独立决策、表现出积极主动行为并能动态适应工作流程要求的</strong>代理可茁壮成长。专业化功能的横向扩展是另一个关键优势--多个专业化代理协同工作，而不是只有一个万能代理，同一代理的多个实例可以异步处理子任务。例如，在我们的新闻编辑室报道突发新闻时，多名记者代理可能会同时从不同角度报道同一新闻。</p><p>最后，需要真正多代理协作的任务是 A2A 的理想选择。这包括<a href="https://arxiv.org/abs/2404.18796">法律硕士即评审团的评估</a>机制、建立共识和投票系统，以及<strong>需要多角度</strong>达成最佳结果的协作式问题解决方法。</p><h3>何时使用 MCP</h3><p>模型上下文协议是扩展单一人工智能模型功能的理想选择。当单个人工智能模型需要访问多个工具和数据源时，MCP 提供了完美的解决方案，集中式推理与分布式工具和直接的工具集成相结合。在我们的新闻编辑室示例中，研究员代理（一种模式）需要访问多个数据源，包括新闻 API、事实核查服务和学术数据库--所有这些都通过标准化的 MCP 服务器访问。</p><p>当工具集成的广泛共享和可重用性变得非常重要时，标准化工具集成就成了优先事项。MCP 凭借其预构建的 MCP 服务器生态系统大放异彩，大大缩短了常见集成的开发时间。当需要简单性和可维护性时，MCP 的请求-响应模式是开发人员所熟悉的，比分布式系统更容易理解和调试，操作复杂性也更低。</p><p>最后，软件供应商通常会提供 MCP，以方便与其系统进行远程通信。这些由供应商提供的 MCP 服务器大大缩短了入网和开发时间，同时为专有系统提供了标准化接口，使集成比定制 API 开发更加简单。</p><h3>何时同时使用两种方法（A2A ❤️ 的 MCP）</h3><p><a href="https://a2a-protocol.org/latest/topics/a2a-and-mcp/">正如 A2A 有关 MCP 集成的文档</a> 所指出的，许多复杂的系统都能从 A2A 和 MCP 的 结合中受益。既需要协调又需要标准化的系统是混合方法的理想选择。A2A 处理代理协调和工作流程协调，而 MCP 则为单个代理提供工具访问。在我们的新闻编辑室示例中，代理通过 A2A 进行协调；工作流程从记者到研究员，再到编辑，最后到出版商。不过，每个代理都使用 MCP 服务器来管理其专用工具，从而实现了干净利落的架构分离。</p><p>多个专门的代理，每个都使用 MCP 进行工具访问，这代表了一种常见的模式，即代理协调层由 A2A 处理，工具访问层由 MCP 管理。这种明确的分工使系统更容易理解和维护。</p><p>将这两种方法结合起来的好处是巨大的。您可以获得多代理系统的组织优势，包括专业化、自主性和并行处理，同时还可以享受 MCP 的标准化和生态系统优势，如工具集成和资源访问。代理协调（A2A）和资源访问（MCP）之间有明确的分离，而且重要的是，A2A 不需要单独用于 API 访问等较小的任务，MCP 可以高效地处理这些任务，而不需要多代理协调的开销。</p><p><strong>常见问题：A2A 与 MCP--使用案例</strong></p><p>功能</p><p>Agent2Agent (A2A)</p><p>模型上下文协议（MCP）</p><p>混合型（A2A + MCP）</p><p>首要目标</p><p>多代理协调：使专业代理团队能够在复杂的多步骤工作流程中协同工作。</p><p>单一代理增强：利用外部工具、资源和数据扩展单一 LLM/Agent 的能力。</p><p>综合实力：A2A 负责团队的工作流程，而 MCP 则为每个团队成员提供工具。</p><p>新闻编辑室团队范例</p><p>工作流程链：新闻主管 → 记者 → 研究员 → 编辑 → 出版商。这是协调层。</p><p>单个代理的工具：记者代理访问样式指南服务器和模板服务器（通过 MCP）。这是工具访问层。</p><p>完整的系统：记者与编辑（A2A）协调，记者使用图像库 MCP 服务器为报道寻找图片。</p><p>何时使用</p><p>当您需要真正的协作、迭代和改进，或需要多个代理分担专业知识时。</p><p>当单个代理需要访问多个工具和数据源或需要与专有系统进行标准化集成时。</p><p>当您需要多代理系统的组织优势以及 MCP 的标准化和生态系统优势时。</p><p>核心效益</p><p>自主性和扩展性：代理可以独立做出决定，系统允许专门功能的横向扩展。</p><p>简单化和标准化：由于集中推理，调试和维护更容易，并为资源提供了通用接口。</p><p>明确区分关注点：使系统更易于理解：A2A = 团队合作，MCP = 工具使用。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1735ea5de41e10fd/6a17f2e26864a4125cb688c4/ddf6a29b1107ac6a63e94ecef703abc561a29e1e-986x656.png" alt="" /><h2>结论</h2><p>这是两篇文章的第一部分，内容涉及基于 A2A 的代理的实施，并通过 MCP 服务器提供支持和外部数据及工具访问。下一篇文章将探讨实际代码，以演示它们如何共同模拟在线新闻编辑室的活动。虽然这两种框架本身都具有极强的能力和灵活性，但当它们协同工作时，你就会发现它们之间的互补性有多大。</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/a2a-protocol-mcp-llm-agent-newsroom-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/a2a-protocol-mcp-llm-agent-newsroom-elasticsearch</guid>
    <category><![CDATA[智能体 AI]]></category>
    <category><![CDATA[AI]]></category>
    <dc:creator><![CDATA[Justin Castilla]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2716d804698ec878/6a17f2e41480095fd7b48888/9f938d8e2f0fdf7509edf028816c48bdbc8b3fc7-1600x900.png" length="0" type="image/png"/>
    <pubDate>Thu, 13 Nov 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>