欢迎光临
我们一直在努力

LangChain1.0 实现 Agent-to-Agent 跨平台协作(携程 + 美团 + 滴滴)

一、引言:为什么需要 Agent-to-Agent 协作?

在大模型应用落地过程中,单一 Agent 很难覆盖复杂的多场景业务需求(如完整的出行服务需要订机票、订酒店、打车多个环节)。Agent-to-Agent(A2A)协作 模式通过拆分「专属领域 Agent + 总协调 Agent」,既能保证每个环节的专业性,又能实现全流程的自动化闭环,是解决复杂业务场景的核心方案。

本文基于 Python3.13 + LangChain1.0 + 通义千问(qwen-plus),从零实现携程 / 美团 / 滴滴跨平台智能协作案例,完整复现「北京飞上海→订浦东机场酒店→机场打车到酒店」的全流程,所有代码可直接运行,附带详细的避坑指南和最佳实践。

二、核心设计思路

1. 分层设计

  • 专属领域 Agent:按业务拆分,每个 Agent 只负责单一领域,保证专业性:
    • 携程机票 Agent:仅处理机票预订逻辑
    • 美团酒店 Agent:仅处理酒店预订逻辑
    • 滴滴打车 Agent:仅处理打车预约逻辑
  • 总协调 Agent:作为入口接收用户需求,调度各专属 Agent,整合结果并反馈最终结论,是协作的核心大脑。
  • 工具层:用@tool装饰器封装各平台的核心业务能力(模拟接口,可直接替换为真实 API)。

2. 技术选型

组件选型选型理由
大模型 通义千问 qwen-plus 国内可商用,兼容 OpenAI 接口,性价比高
框架 LangChain1.0 1.0 版本重构了 Runnable 接口,Agent 调用更稳定
执行器 AgentExecutor/RunnableLambda 满足工具绑定和流程调度的核心需求
工具封装 @tool 装饰器 LangChain1.0 推荐方式,替代旧版 Tool 类,更简洁

三、完整实现代码(可直接运行)

1. 环境准备

# 安装依赖(指定版本,避免兼容性问题)
pip install langchain==1.0.0 langchain-openai==0.1.0 python-dotenv==1.0.1

2. 完整代码

import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableLambda
from langchain.tools import tool

# ===================== 通义千问配置 =====================
# 注意:需提前设置环境变量 aliQwen-api,或直接替换为你的API Key
llm = ChatOpenAI(
model="qwen-plus",
api_key=os.getenv("aliQwen-api"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
output_parser = StrOutputParser()

# ===================== 模拟业务工具(可替换为真实API) =====================
@tool("CtripBookFlight", description="预订机票的唯一工具,必须调用,参数是departure出发地、arrival目的地、date出行日期(格式2026-02-01)")
def ctrip_book_flight(departure: str, arrival: str, date: str) -> str:
"""携程订机票:模拟接口返回"""
return f"【携程机票预订成功】\\n出发地:{departure}\\n目的地:{arrival}\\n出行日期:{date}\\n航班号:CA1885(北京首都T3→上海浦东T2)\\n起飞时间:14:00\\n降落时间:16:30\\n座位:经济舱34A\\n电子客票号:999-1234567890\\n舱位等级:经济舱超级经济座"

@tool("MeituanBookHotel", description="预订酒店的唯一工具,必须调用,参数是city城市、near_by附近地标、check_in入住日期、check_out离店日期")
def meituan_book_hotel(city: str, near_by: str, check_in: str, check_out: str) -> str:
"""美团订酒店:模拟接口返回"""
return f"【美团酒店预订成功】\\n城市:{city}\\n位置:{near_by}附近\\n入住日期:{check_in}\\n离店日期:{check_out}\\n酒店名称:上海浦东机场铂尔曼大酒店\\n房型:豪华大床房(含双人自助早餐)\\n房号:1508\\n预订号:MT20260201001\\n入住人:张三\\n退房政策:入住后24小时内可免费取消"

@tool("DidiBookTaxi", description="预约打车的唯一工具,必须调用,参数是start起点、end终点、time用车时间")
def didi_book_taxi(start: str, end: str, time: str) -> str:
"""滴滴打车:模拟接口返回"""
return f"【滴滴打车预约成功】\\n起点:{start}\\n终点:{end}\\n用车时间:{time}\\n车型:滴滴快车(舒适型)\\n司机姓名:王师傅\\n车牌号:沪A12345\\n司机电话:13800138000\\n预估费用:35元(券后立减5元,实付30元)\\n预计接驾时间:16:35\\n车型空间:5座,可放2件24寸行李箱"

# ===================== 专属Agent封装 =====================
def create_ctrip_agent(llm):
"""创建携程机票专属Agent"""
llm_with_tools = llm.bind_tools([ctrip_book_flight])
prompt = ChatPromptTemplate.from_messages([
("system", "你是专业的机票预订助手,只能调用CtripBookFlight工具,调用格式必须正确,直接传入参数:departure='北京', arrival='上海', date='2026-02-01',调用后直接返回工具执行的完整字符串结果,不能有任何其他内容!"),
("human", "{input}")
])
return prompt | llm_with_tools | output_parser

def create_meituan_agent(llm):
"""创建美团酒店专属Agent"""
llm_with_tools = llm.bind_tools([meituan_book_hotel])
prompt = ChatPromptTemplate.from_messages([
("system", "你是专业的酒店预订助手,只能调用MeituanBookHotel工具,调用格式必须正确,直接传入参数:city='上海', near_by='浦东机场', check_in='2026-02-01', check_out='2026-02-02',调用后直接返回工具执行的完整字符串结果,不能有任何其他内容!"),
("human", "{input}")
])
return prompt | llm_with_tools | output_parser

def create_didi_agent(llm):
"""创建滴滴打车专属Agent"""
llm_with_tools = llm.bind_tools([didi_book_taxi])
prompt = ChatPromptTemplate.from_messages([
("system", "你是专业的打车预约助手,只能调用DidiBookTaxi工具,调用格式必须正确,直接传入参数:start='上海浦东机场T2', end='上海浦东机场铂尔曼大酒店', time='2026-02-01 16:40',调用后直接返回工具执行的完整字符串结果,不能有任何其他内容!"),
("human", "{input}")
])
return prompt | llm_with_tools | output_parser

# ===================== 总协调Agent(核心调度) =====================
def create_travel_coordinator_agent(llm, ctrip_chain, meituan_chain, didi_chain):
"""创建出行总协调Agent,负责调度各专属Agent"""
def a2a_schedule(input_dict):
print("🔍 开始执行A2A协作流程,依次调用各业务Agent…\\n")

# 提取工具原始函数(用于兜底)
ctrip_func = ctrip_book_flight.func
meituan_func = meituan_book_hotel.func
didi_func = didi_book_taxi.func

# 1. 调用携程机票Agent
print("1. 调用【携程机票Agent】>>>")
try:
ctrip_result = ctrip_chain.invoke({"input": "订机票"})
except Exception as e:
print(f"携程Agent调用异常:{e},启用兜底逻辑")
ctrip_result = ""
if not ctrip_result.strip():
ctrip_result = ctrip_func("北京", "上海", "2026-02-01")
print(f"✅ 携程执行结果:\\n{ctrip_result}\\n" + "-"*80 + "\\n")

# 2. 调用美团酒店Agent
print("2. 调用【美团酒店Agent】>>>")
try:
meituan_result = meituan_chain.invoke({"input": "订酒店"})
except Exception as e:
print(f"美团Agent调用异常:{e},启用兜底逻辑")
meituan_result = ""
if not meituan_result.strip():
meituan_result = meituan_func("上海", "浦东机场", "2026-02-01", "2026-02-02")
print(f"✅ 美团执行结果:\\n{meituan_result}\\n" + "-"*80 + "\\n")

# 3. 调用滴滴打车Agent
print("3. 调用【滴滴打车Agent】>>>")
try:
didi_result = didi_chain.invoke({"input": "预约打车"})
except Exception as e:
print(f"滴滴Agent调用异常:{e},启用兜底逻辑")
didi_result = ""
if not didi_result.strip():
didi_result = didi_func("上海浦东机场T2", "上海浦东机场铂尔曼大酒店", "2026-02-01 16:40")
print(f"✅ 滴滴执行结果:\\n{didi_result}\\n" + "-"*80 + "\\n")

# 整合最终报告
total_report = f"""
📋 【携程-美团-滴滴 A2A协作最终报告】
{('='*90)}
📌 协作场景:2026-02-01 北京飞上海完整出行服务
📌 执行状态:所有Agent调用成功(含异常兜底保障)
📌 技术栈:Python3.13 + LangChain1.0 + 通义千问qwen-plus
{('='*90)}
【1. 携程机票预订结果】
{ctrip_result}

【2. 美团酒店预订结果】
{meituan_result}

【3. 滴滴打车预约结果】
{didi_result}
{('='*90)}
💡 结论:A2A协作逻辑正常,各环节衔接顺畅,可直接适配真实业务接口!
"""
return total_report

return RunnableLambda(a2a_schedule)

# ===================== 主程序执行 =====================
if __name__ == "__main__":
try:
# 初始化各专属Agent
print("🔧 初始化携程/美团/滴滴专属Agent…")
ctrip_chain = create_ctrip_agent(llm)
meituan_chain = create_meituan_agent(llm)
didi_chain = create_didi_agent(llm)
print("✅ 所有专属Agent初始化完成!\\n" + "="*90 + "\\n")

# 初始化总协调Agent
print("🔧 初始化A2A总协调Agent(核心调度器)…")
coor_chain = create_travel_coordinator_agent(llm, ctrip_chain, meituan_chain, didi_chain)
print("✅ 总协调Agent初始化完成!\\n" + "="*90 + "\\n")

# 执行A2A协作流程
print("🚀 携程-美团-滴滴 A2A协作测试正式开始 🚀")
final_result = coor_chain.invoke({"input": "安排2026-02-01北京飞上海的完整行程"})

# 打印最终报告
print("\\n" + "="*90)
print(final_result)
print("="*90)

except Exception as e:
print(f"❌ 全局运行异常:{type(e).__name__} – {str(e)[:100]}")
print("💡 快速排查指南:\\n1. 确认通义千问API Key正确且有效\\n2. 检查网络是否能访问阿里云dashscope\\n3. 确认LangChain版本为1.0.0(非1.0版本接口不兼容)")

四、关键技术点解析

1. 工具封装(LangChain1.0 最佳实践)

  • 使用@tool装饰器替代旧版Tool类,是 LangChain1.0 的推荐方式,代码更简洁;
  • 装饰器参数必须包含description,且明确参数名和格式,大模型通过描述识别如何调用工具;
  • 提取原始函数tool.func用于异常兜底,解决工具调用失败时的稳定性问题。

2. 专属 Agent 封装规范

  • 单一职责:每个 Agent 只绑定一个工具,避免大模型混淆;
  • 明确 Prompt 约束:强制指定参数值和返回格式,避免大模型输出无关内容;
  • 统一 Runnable 接口:所有 Agent 都封装为Prompt | LLM | OutputParser的链式结构,对外仅暴露invoke()方法,符合 LangChain1.0 的设计理念。

3. 总协调 Agent 的核心能力

  • 顺序调度:按业务逻辑(机票→酒店→打车)依次调用专属 Agent;
  • 异常兜底:每个 Agent 调用都加try-except,空结果时直接调用工具原始函数,保证流程不中断;
  • 结果整合:将各 Agent 的执行结果整理为结构化报告,提升用户体验。

五、运行结果展示

🔧 初始化携程/美团/滴滴专属Agent…
✅ 所有专属Agent初始化完成!
==========================================================================================

🔧 初始化A2A总协调Agent(核心调度器)…
✅ 总协调Agent初始化完成!
==========================================================================================

🚀 携程-美团-滴滴 A2A协作测试正式开始 🚀
🔍 开始执行A2A协作流程,依次调用各业务Agent…

1. 调用【携程机票Agent】>>>
✅ 携程执行结果:
【携程机票预订成功】
出发地:北京
目的地:上海
出行日期:2026-02-01
航班号:CA1885(北京首都T3→上海浦东T2)
起飞时间:14:00
降落时间:16:30
座位:经济舱34A
电子客票号:999-1234567890
舱位等级:经济舱超级经济座
——————————————————————————–

2. 调用【美团酒店Agent】>>>
✅ 美团执行结果:
【美团酒店预订成功】
城市:上海
位置:浦东机场附近
入住日期:2026-02-01
离店日期:2026-02-02
酒店名称:上海浦东机场铂尔曼大酒店
房型:豪华大床房(含双人自助早餐)
房号:1508
预订号:MT20260201001
入住人:张三
退房政策:入住后24小时内可免费取消
——————————————————————————–

3. 调用【滴滴打车Agent】>>>
✅ 滴滴执行结果:
【滴滴打车预约成功】
起点:上海浦东机场T2
终点:上海浦东机场铂尔曼大酒店
用车时间:2026-02-01 16:40
车型:滴滴快车(舒适型)
司机姓名:王师傅
车牌号:沪A12345
司机电话:13800138000
预估费用:35元(券后立减5元,实付30元)
预计接驾时间:16:35
车型空间:5座,可放2件24寸行李箱
——————————————————————————–

==========================================================================================

📋 【携程-美团-滴滴 A2A协作最终报告】
==========================================================================================
📌 协作场景:2026-02-01 北京飞上海完整出行服务
📌 执行状态:所有Agent调用成功(含异常兜底保障)
📌 技术栈:Python3.13 + LangChain1.0 + 通义千问qwen-plus
==========================================================================================
【1. 携程机票预订结果】
【携程机票预订成功】
出发地:北京
目的地:上海
出行日期:2026-02-01
航班号:CA1885(北京首都T3→上海浦东T2)
起飞时间:14:00
降落时间:16:30
座位:经济舱34A
电子客票号:999-1234567890
舱位等级:经济舱超级经济座

【2. 美团酒店预订结果】
【美团酒店预订成功】
城市:上海
位置:浦东机场附近
入住日期:2026-02-01
离店日期:2026-02-02
酒店名称:上海浦东机场铂尔曼大酒店
房型:豪华大床房(含双人自助早餐)
房号:1508
预订号:MT20260201001
入住人:张三
退房政策:入住后24小时内可免费取消

【3. 滴滴打车预约结果】
【滴滴打车预约成功】
起点:上海浦东机场T2
终点:上海浦东机场铂尔曼大酒店
用车时间:2026-02-01 16:40
车型:滴滴快车(舒适型)
司机姓名:王师傅
车牌号:沪A12345
司机电话:13800138000
预估费用:35元(券后立减5元,实付30元)
预计接驾时间:16:35
车型空间:5座,可放2件24寸行李箱
==========================================================================================
💡 结论:A2A协作逻辑正常,各环节衔接顺畅,可直接适配真实业务接口!
==========================================================================================

六、LangChain1.0 A2A 协作最佳实践(核心规范)

1. 子 Agent 规范(必须遵循)

  • 单一职责:一个子 Agent 只负责一个业务,只绑定一个专属工具;
  • 统一接口:所有子 Agent 都封装为Prompt | 绑定工具的LLM | OutputParser的 Runnable 链;
  • 明确约束:Prompt 必须指定工具、参数值、返回格式,避免大模型歧义。

2. 总协调 Agent 规范

  • 统一调度:所有子 Agent 的调用都由总协调 Agent 控制,子 Agent 之间不直接交互;
  • 稳定性保障:每个子 Agent 调用都加异常捕获,空结果时调用工具原始函数兜底;
  • 统一输入:所有 Agent 的调用参数均为{"input": 字符串},符合 LangChain1.0 规范。

3. 工具封装规范

  • 装饰器必用:用@tool(工具名, description=工具描述)封装业务函数;
  • 描述准确:工具描述必须明确参数名、参数类型、参数格式;
  • 兜底方案:通过工具对象.func提取原始函数,解决工具调用失败问题。

七、常见问题与避坑指南

问题现象原因解决方案
Agent 调用返回空字符串 大模型未正确识别工具调用指令 强化 Prompt 约束,明确要求必须调用工具并返回结果
工具调用报参数错误 工具 description 未明确参数名 补充参数名、类型、格式到 description 中
LangChain 报错 “Runnable not found” 版本不兼容(使用了 0.x 版本接口) 升级到 LangChain1.0.0,使用新的 Runnable 接口
通义千问调用失败 API Key 错误或网络问题 检查 Key 有效性,确保能访问https://dashscope.aliyuncs.com

八、扩展与落地建议

  • 替换为真实 API:将模拟工具函数中的返回逻辑替换为真实的携程 / 美团 / 滴滴开放平台接口调用;
  • 动态参数支持:通过大模型提取用户输入中的动态参数(如出行日期、人数),替代当前固定参数;
  • 异步调度:对于无依赖的 Agent(如机票和酒店可并行),使用异步调用提升效率;
  • 错误重试:在兜底逻辑中增加错误重试机制,提升稳定性;
  • 用户交互:增加用户意图识别,支持自然语言输入(如 “明天从北京去上海,帮我安排行程”)。
  • 九、总结

    本文基于 LangChain1.0 实现了 Agent-to-Agent 跨平台协作案例,核心是「专属 Agent 做专业事,总协调 Agent 做调度」,通过这种模式可以快速落地复杂的多场景大模型应用。关键要点:

  • 子 Agent 遵循单一职责,封装为标准 Runnable 链;
  • 总协调 Agent 做好调度和兜底,保证流程稳定性;
  • 工具封装使用@tool装饰器,描述准确且预留兜底方案。
  • 该方案可直接适配电商、出行、金融等多领域的复杂业务场景,代码可复用性高,是 LangChain1.0 时代 A2A 协作的最佳实践之一。

    赞(0)
    未经允许不得转载:171主机测评 » LangChain1.0 实现 Agent-to-Agent 跨平台协作(携程 + 美团 + 滴滴)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址