大数跨境
0
0

三大框架合体:A2A + MCP + LangChain 打造最强多代理聊天机器人

三大框架合体:A2A + MCP + LangChain 打造最强多代理聊天机器人 AI技术研习社
2025-08-25
151
导读:A2A

在人工智能技术快速发展的背景下,构建一个能自主分析股票行情、抓取财经新闻并提供专业解读的聊天机器人已从概念变为现实。

通过结合 Google 的代理到代理协议(A2A)、模型上下文协议(MCP)与 LangChain 框架,可打造一个多代理协同、动态响应的智能投研系统,让 AI 像专业团队一样运作。

本文将带你完成服务器搭建、工具开发到元代理整合的全流程,实现多代理系统的工程化落地。

A2A 与 MCP:构建智能协作的核心

Agent-to-Agent Protocol(A2A)使 AI 代理能够发现彼此、通信并协同解决问题,模拟专家团队协作机制。Model Context Protocol(MCP)则为大模型提供统一接口,用于调用外部工具和数据源,类似于 API 调用。

二者结合,可实现从静态脚本向自主调度、多组件联动的智能系统跃迁。

系统工作流程

当用户提问“苹果和英伟达最新股价是多少?有何相关新闻?”时,系统自动触发以下流程:

  • 元代理解析问题,路由至相应子代理;
  • 股票数据工具通过 yfinance 获取 AAPL 和 NVDA 的实时价格、涨跌幅、市值等指标;
  • 财经新闻工具抓取 Finviz 头条资讯,提取标题、链接及发布时间;
  • A2A 专家代理调用 GPT 模型进行综合分析;
  • 最终输出结构清晰、内容完整的可读报告。

环境准备

确保已安装以下 Python 库:

pip install python-a2a fastmcp langchain-openai yfinance pandas requests beautifulsoup4

同时设置环境变量 OPENAI_API_KEY 为你的 OpenAI 密钥。

搭建 A2A 服务器

将基于 OpenAI 的金融专家封装为 A2A 代理:

import os
from python_a2a import OpenAIA2AServer, run_server
from python_a2a import AgentCard, AgentSkill

agent_card = AgentCard(
    name="Stock Market Expert",
    description="Expert in market trends, fundamentals, and investment strategies.",
    url="http://localhost:5000",
    version="1.0.0",
    skills=[
        AgentSkill(
            name="Market Analysis",
            description="Analyze overall market sentiment and key indicators.",
            examples=["What's the current market sentiment?", "Impact of interest rates on tech stocks?"]
        ),
        AgentSkill(
            name="Investment Strategies",
            description="Discuss risk management and portfolio diversification.",
            examples=["How to diversify my portfolio?", "Explanation of dollar-cost averaging."]
        ),
        AgentSkill(
            name="Company Analysis",
            description="Interpret financial ratios and company fundamentals.",
            examples=["How to read P/E ratios?", "Key metrics for evaluating growth stocks."]
        )
    ]
)

a2a_server = OpenAIA2AServer(
    api_key=os.environ['OPENAI_API_KEY'],
    model="gpt-4o",
    temperature=0.0,
    system_prompt="You are a stock market and financial analysis expert. Provide factual, concise insights."
)

if __name__ == '__main__':
    run_server(a2a_server, host='0.0.0.0', port=5000)

建议使用 gunicorn 等进程管理器保证服务持续运行。

构建 MCP 工具

初始化 MCP 服务器,并定义关键功能模块:

from python_a2a.mcp import FastMCP

mcp_server = FastMCP(
    name="FinanceTools",
    description="Tools for retrieving stock data and financial news."
)

股票数据获取工具

支持通过股票代码或公司名称查询历史行情与核心指标:

import re
import yfinance
import pandas as pd

@mcp_server.tool(
    name="stock_data",
    description="Fetch metrics for stocks by ticker symbols or names."
)
def stock_data(input_str=None, **kwargs):
    input_str = kwargs.get('input', input_str)
    if not input_str:
        return {"error": "No input provided."}
    
    tickers = []
    if ',' in input_str:
        tickers = [t.strip().upper() for t in input_str.split(',')]
    else:
        tickers = [w.upper() for w in re.findall(r"\b[A-Za-z]{1,5}\b", input_str)]
    
    common = {'apple': 'AAPL', 'nvidia': 'NVDA'}
    if not tickers:
        for name, t in common.items():
            if name in input_str.lower(): tickers.append(t)
    
    results = {}
    for t in tickers:
        tk = yfinance.Ticker(t)
        hist = tk.history(period="1mo")
        if hist.empty:
            results[t] = {"error": "No data."}
            continue
        
        first, last = hist.iloc[0], hist.iloc[-1]
        change = float(last['Close'] - first['Close'])
        pct = change / float(first['Close']) * 100
        info = tk.info
        
        summary = {
            "latest_price": float(last['Close']),
            "price_change": change,
            "%_change": pct,
            "52_week_high": info.get('fiftyTwoWeekHigh'),
            "52_week_low": info.get('fiftyTwoWeekLow'),
            "market_cap": info.get('marketCap'),
            "pe_ratio": info.get('trailingPE')
        }
        results[t] = summary
    
    return results

财经新闻抓取工具

从 Finviz 抓取指定股票的最新新闻与公司快照信息:

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

@mcp_server.tool(
    name="web_scraper",
    description="Scrape latest headlines and company snapshot from Finviz."
)
def web_scraper(input_str=None, **kwargs):
    ticker = (kwargs.get('input') or input_str or '').upper()
    url = f"https://finviz.com/quote.ashx?t={ticker.lower()}"
    headers = {'User-Agent': 'Mozilla/5.0'}
    
    resp = requests.get(url, headers=headers)
    soup = BeautifulSoup(resp.text, 'html.parser')
    news = []
    
    for row in soup.select('#news-table tr')[:5]:
        date, title = row.find_all('td')
        link = title.a['href']
        if not link.startswith('http'):
            link = urljoin(url, link)
        news.append({"date": date.text, "title": title.text.strip(), "link": link})
    
    details = {}
    snap = soup.find('table', {'class': 'snapshot-table2'})
    for r in snap.find_all('tr'):
        cells = r.find_all('td')
        for i in range(0, len(cells), 2):
            if i+1 < len(cells):
                details[cells[i].text] = cells[i+1].text
    
    return {"news_items": news, "snapshot": details}

启动 MCP 服务器

运行以下命令启动服务:

python -c "from your_module import mcp_server; mcp_server.run(host='0.0.0.0', port=6000)"

集成至 LangChain 实现统一调度

将 A2A 代理与 MCP 工具接入 LangChain,实现自动化任务编排:

from python_a2a.langchain import to_langchain_agent, to_langchain_tool
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, Tool, AgentType

a2a_agent = to_langchain_agent("http://localhost:5000")
stock_tool = to_langchain_tool("http://localhost:6000", "stock_data")
news_tool = to_langchain_tool("http://localhost:6000", "web_scraper")

def ask_expert(q): return a2a_agent.invoke(q).get('output')
def fetch_data(q): return stock_tool.invoke(q)
def fetch_news(q): return news_tool.invoke(q)

tools = [
    Tool(name="StockExpert", func=ask_expert, description="Ask financial questions."),
    Tool(name="StockData", func=fetch_data, description="Retrieve stock metrics."),
    Tool(name="FinancialNews", func=fetch_news, description="Get latest financial headlines.")
]

llm = ChatOpenAI(model="gpt-4o", temperature=0.0)
meta_agent = initialize_agent(
    tools, llm, agent=AgentType.OPENAI_FUNCTIONS, verbose=True
)

主流程调用

一次调用即可完成全链路处理:

if __name__ == '__main__':
    query = "What are the current stock prices of Apple and NVIDIA, plus top news?"
    response = meta_agent.invoke(query)
    print("Meta-Agent Response:\n", response)

该调用将自动完成问题解析、工具选择、数据获取、新闻采集与专业分析,最终生成整合报告。

优化建议与扩展方向

为保障系统稳定性,需注意:

  • 检查端口占用情况,确保 A2A(5000)与 MCP(6000)服务正常运行;
  • 处理 pandas/numpy 数据类型在 JSON 序列化中的兼容性问题;
  • 使用 try-except 结构提升错误处理能力;
  • 借助正则表达式与名称映射增强输入识别灵活性。

LangChain 的 OPENAI_FUNCTIONS 代理可实现智能工具选择,真正达成自主协作。

未来可扩展方向包括:

  • 增加投资组合跟踪、情绪分析、期权数据等功能模块;
  • 通过 Docker 或 Kubernetes 部署,提升系统可扩展性;
  • 集成 Web 前端或 Slack 插件,提升交互体验。

通过此架构,你已构建出一个集 A2A 协作、MCP 工具调用与 LangChain 编排于一体的多代理智能系统,赋予 AI 类似专业团队的综合决策能力。

【声明】内容源于网络
0
0
AI技术研习社
1234
内容 174
粉丝 0
AI技术研习社 1234
总阅读3.6k
粉丝0
内容174