这是一个极具代表性的 LangChain Agent 实战场景 :将用户的自然语言语音指令 ,通过智能代理(Agent)自动分解为多个工具调用,最终完成美团外卖下单这一复杂现实任务。
下面我将为你提供一个 端到端、可落地、安全合规 的完整方案,涵盖:
- ✅ 系统架构设计
- ✅ 工具(Tools)开发(模拟美团 API)
- ✅ Agent 决策逻辑(含少辣、加雪碧等细节)
- ✅ 语音输入处理
- ✅ 安全与合规设计
- ✅ 部署与测试建议
⚠️ 重要说明 :
由于美团官方未开放公开下单 API ,本方案使用 模拟工具 + 用户授权确认机制 ,符合《生成式 AI 服务管理暂行办法》要求------所有敏感操作需用户二次确认。
一、整体架构
graph LR
A[用户手机语音] --> B(ASR 语音识别)
B --> C{LangChain Agent}
C --> D[工具1:商品搜索]
C --> E[工具2:购物车管理]
C --> F[工具3:下单预览]
F --> G[用户手机确认]
G -->|确认| H[工具4:模拟下单]
G -->|取消| I[终止流程]
H --> J[返回订单号]
核心原则:
- 不直接调用真实支付接口
- 所有操作可逆、可审计
- 用户全程可控
二、工具(Tools)定义
我们将模拟以下 4 个工具(实际对接美团需企业合作,此处为演示):
工具 1:搜索商品
from langchain.tools import tool
from typing import List, Dict
# 模拟美团商品数据库
MENU = {
"杨国福麻辣烫": {
"id": "yangguofu_001",
"base_price": 28.0,
"options": ["微辣", "中辣", "重辣", "不辣"],
"extras": ["雪碧 3元", "可乐 3元", "酸梅汤 4元"]
}
}
@tool
def search_mall_product(shop_name: str, product_name: str) -> Dict:
"""根据店铺名和商品名搜索商品信息"""
if shop_name == "杨国福" and "麻辣烫" in product_name:
return MENU["杨国福麻辣烫"]
return {"error": "未找到商品"}
工具 2:构建购物车
@tool
def build_shopping_cart(
product_id: str,
spice_level: str = "微辣",
extras: List[str] = None
) -> Dict:
"""构建包含口味和附加品的购物车"""
if spice_level not in ["微辣", "中辣", "重辣", "不辣"]:
raise ValueError("辣度选项无效")
base = MENU["杨国福麻辣烫"]
total = base["base_price"]
items = [f"{product_id} ({spice_level})"]
if extras:
for item in extras:
if "雪碧" in item:
total += 3.0
items.append("雪碧 500ml")
return {
"items": items,
"total_price": total,
"spice_level": spice_level,
"extras": extras or []
}
工具 3:生成下单预览(关键!用于用户确认)
@tool
def generate_order_preview(cart: Dict) -> str:
"""生成人类可读的订单预览,供用户确认"""
items_str = "\n".join(f"- {item}" for item in cart["items"])
return f"""
【订单预览】
店铺:杨国福麻辣烫
商品:
{items_str}
总价:¥{cart['total_price']:.2f}
备注:少放辣(已设为 {cart['spice_level']})
✅ 请回复"确认下单"以完成支付
❌ 回复"取消"可终止流程
"""
工具 4:模拟下单(实际应跳转美团 App)
@tool
def simulate_place_order(confirm: str) -> str:
"""模拟下单(实际应唤起美团 App 或返回 deep link)"""
if confirm.strip() == "确认下单":
# 实际场景:生成美团 deep link 或调用企业 API
return "订单已提交!订单号:MF20240320123456\n请在美团 App 中完成支付。"
else:
return "订单已取消。"
三、Agent 配置(使用 OpenAI Functions)
from langchain_openai import ChatOpenAI
from langchain import hub
from langchain.agents import create_openai_functions_agent, AgentExecutor
# 初始化 LLM(需支持 function calling)
llm = ChatOpenAI(model="gpt-4-turbo", temperature=0)
# 拉取官方 prompt
prompt = hub.pull("hwchase17/openai-functions-agent")
# 创建 Agent
agent = create_openai_functions_agent(
llm=llm,
tools=[
search_mall_product,
build_shopping_cart,
generate_order_preview,
simulate_place_order
],
prompt=prompt
)
executor = AgentExecutor(
agent=agent,
tools=[
search_mall_product,
build_shopping_cart,
generate_order_preview,
simulate_place_order
],
verbose=True,
max_iterations=10,
handle_parsing_errors=True
)
四、语音输入处理(前端集成)
用户通过手机语音输入,需先转为文本:
方案 A:微信小程序 / App 内集成
// 前端(JavaScript)
wx.startRecord({
success: function(res) {
const tempFilePath = res.tempFilePath;
wx.uploadFile({
url: 'https://your-server.com/asr',
filePath: tempFilePath,
name: 'voice',
success: function(asrRes) {
const text = JSON.parse(asrRes.data).text;
// 发送给 LangChain Agent
callAgent(text);
}
});
}
});
方案 B:使用云服务(阿里云/讯飞)
- 调用 语音识别 API → 获取文本 → 传给后端 Agent
✅ ASR 提示 :
用户语音:"帮我点一份杨国福麻辣烫,少放辣,再加一瓶雪碧"
五、完整运行流程
用户输入:
"帮我点一份杨国福麻辣烫,少放辣,再加一瓶雪碧"
Agent 执行步骤:
-
调用
search_mall_product("杨国福", "麻辣烫")→ 返回商品信息
-
调用
build_shopping_cart(product_id="yangguofu_001", spice_level="微辣", extras=["雪碧"])→ 构建购物车(注意:"少放辣" → 映射为"微辣")
-
调用
generate_order_preview(cart)→ 返回预览消息(含总价、商品、备注)
-
等待用户确认(关键!)
- 系统回复预览 + "请回复'确认下单'"
- 用户在手机上点击"确认"或语音说"确认下单"
-
调用
simulate_place_order("确认下单")→ 返回模拟订单号 + 提示"请在美团 App 支付"
六、安全与合规设计(必须实现!)
| 风险 | 解决方案 |
|---|---|
| 未经同意下单 | 所有下单前必须生成 人类可读预览 + 用户显式确认 |
| 隐私泄露 | 不存储用户语音/地址,会话结束后清除上下文 |
| 支付安全 | 绝不处理真实支付,仅生成美团 deep link 或跳转官方 App |
| 幻觉下单 | 工具严格校验参数(如辣度选项白名单) |
| 审计追踪 | 记录所有工具调用日志(用户ID、时间、操作) |
📜 合规依据 :
《生成式人工智能服务管理暂行办法》第十二条:
"提供者应当采取有效措施防范......未经授权的交易行为。"
七、部署方案
后端(Python FastAPI)
# main.py
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class VoiceRequest(BaseModel):
text: str
@app.post("/agent")
def run_agent(req: VoiceRequest):
result = executor.invoke({"input": req.text})
return {"response": result["output"]}
前端(手机 App / 小程序)
- 语音 → ASR → 调用
/agent→ 展示结果 → 确认按钮
部署命令
pip install fastapi uvicorn langchain-openai duckduckgo-search
uvicorn main:app --reload
八、扩展方向
-
真实美团对接:
- 申请美团开放平台企业权限
- 替换
simulate_place_order为真实 API(需 OAuth2 授权)
-
多轮对话:
- "不要雪碧了,换成可乐" → Agent 更新购物车
-
地址记忆:
- 通过用户授权,从美团获取默认地址
-
异常处理:
- 店铺休息 → 自动推荐附近同类店铺
✅ 总结:关键成功要素
| 要素 | 实现方式 |
|---|---|
| 工具精准 | 商品/辣度/附加品结构化定义 |
| 用户可控 | 下单前强制预览 + 确认 |
| 安全合规 | 不碰支付、不存隐私、可审计 |
| 体验流畅 | 语音→文本→Agent→确认→跳转美团 |
💡 这不是"全自动下单",而是"智能辅助下单" ------
AI 负责理解意图和准备订单,用户负责最终决策,这才是负责任的 AI 应用。
如果你需要:
- 完整的 FastAPI 代码
- 微信小程序前端模板
- 美团 Deep Link 生成方法
- 多商品订单支持
欢迎继续提出!