1. 项目概述:LangChain Agent在智能外卖场景的实战应用
这个项目展示了如何利用LangChain Agent技术构建一个智能外卖下单辅助系统。作为一名长期从事AI应用开发的工程师,我发现将自然语言处理技术应用于日常生活场景时,最关键的挑战在于如何在保持系统智能性的同时确保安全合规。这个方案完美解决了这个问题。
系统的工作流程非常直观:用户通过语音发出类似"帮我点一份杨国福麻辣烫,少放辣,再加一瓶雪碧"的指令,系统会通过以下几个核心步骤完成处理:
- 语音识别(ASR)将语音转为文本
- LangChain Agent解析用户意图
- 调用系列工具完成商品搜索、购物车构建
- 生成订单预览供用户确认
- 用户确认后模拟下单流程
这个方案最大的亮点在于它严格遵守了《生成式人工智能服务管理暂行办法》的要求,所有敏感操作都需要用户二次确认,绝不越权处理真实支付。这种"智能辅助"而非"全自动"的设计理念,正是当前AI应用开发的最佳实践。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计与核心组件
2.1 整体架构解析
系统的架构设计遵循了模块化、可扩展的原则,主要包含以下核心组件:
code复制用户语音输入 → ASR语音识别 → LangChain Agent → 工具调用链 → 用户确认 → 结果输出
具体来看,数据流经过以下处理环节:
- 前端交互层:接收用户语音输入,通过微信小程序或App内置录音功能采集音频
- 语音识别层:将音频转换为文本,可以使用云服务(如阿里云ASR)或本地模型
- Agent处理层:LangChain Agent解析文本意图,决策工具调用顺序
- 工具执行层:四个核心工具依次执行搜索、购物车构建等操作
- 用户确认层:生成人类可读的订单预览,等待用户明确确认
- 结果输出层:返回订单信息或跳转链接
2.2 核心工具设计
系统设计了四个关键工具,每个工具都有明确的职责边界:
- 商品搜索工具:对接模拟的商品数据库,返回结构化商品信息
- 购物车管理工具:处理商品定制需求(如辣度调整、附加商品)
- 订单预览工具:生成用户友好的订单摘要
- 模拟下单工具:处理最终确认逻辑,返回模拟订单号
这种工具拆分方式确保了每个功能模块的单一职责,便于后期维护和扩展。例如,如果需要增加新的店铺支持,只需修改商品搜索工具,不会影响其他工具的正常工作。
3. 工具开发与实现细节
3.1 商品搜索工具实现
商品搜索工具是整个系统的起点,它的核心功能是根据用户提到的店铺和商品名称,返回详细的商品信息。以下是该工具的关键实现细节:
python复制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": "未找到商品"}
这个实现有几个值得注意的设计点:
- 使用Python类型注解明确输入输出格式,便于Agent理解工具能力
- 商品数据库采用字典结构存储,便于快速查询
- 返回结构化数据,包含商品ID、基础价格、可选参数等信息
- 错误处理返回明确的错误信息而非抛出异常
在实际应用中,这个工具可以扩展支持更多店铺和商品,只需要扩充MENU字典即可。对于生产环境,建议将商品数据存储在数据库中,而非硬编码在代码中。
3.2 购物车管理工具开发
购物车工具负责处理用户的个性化需求,如调整辣度、添加附加商品等。它的实现展示了如何处理复杂的用户定制需求:
python复制@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 []
}
这个工具的几个关键设计决策:
- 参数默认值设置:"微辣"作为默认辣度,符合大多数用户习惯
- 严格的参数校验:确保辣度选项在允许范围内
- 灵活的价格计算:根据附加商品动态调整总价
- 清晰的返回结构:包含所有必要信息供后续工具使用
在真实场景中,这个工具可以进一步扩展支持更多定制选项,如温度选择(热/冷)、特殊要求(不要香菜)等。
4. Agent配置与决策逻辑
4.1 Agent初始化与工具集成
LangChain Agent的核心优势在于它能智能地决定何时以及如何调用各种工具。以下是配置Agent的关键代码:
python复制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
)
这段配置代码有几个技术要点:
- 使用GPT-4-turbo作为底层LLM,因其优秀的函数调用能力
- temperature设为0,确保决策的确定性
- 从LangChain Hub拉取优化过的agent prompt
- 创建AgentExecutor时设置max_iterations=10,防止无限循环
- handle_parsing_errors=True确保优雅处理解析错误
4.2 Agent决策流程解析
当用户输入"帮我点一份杨国福麻辣烫,少放辣,再加一瓶雪碧"时,Agent的执行逻辑如下:
- 意图识别:LLM分析用户输入,识别出需要调用搜索工具
- 工具调用:调用search_mall_product("杨国福", "麻辣烫")
- 结果处理:获取商品信息后,LLM决定下一步调用购物车工具
- 参数映射:将"少放辣"映射为"微辣","加一瓶雪碧"转为extras参数
- 预览生成:调用generate_order_preview展示订单详情
- 等待确认:暂停执行,等待用户确认
- 最终执行:用户确认后调用simulate_place_order完成流程
这个流程展示了Agent如何将自然语言指令分解为一系列结构化操作,并在适当的时候暂停等待用户确认,体现了良好的交互设计。
5. 语音输入处理方案
5.1 前端语音采集实现
语音输入是这个系统的重要交互方式,前端实现需要考虑跨平台兼容性。以下是微信小程序中的实现示例:
javascript复制// 前端(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);
}
});
}
});
这段代码实现了完整的语音采集和处理流程:
- 使用微信小程序API开始录音
- 获取录音文件临时路径
- 上传到ASR服务端进行语音识别
- 将识别结果发送给Agent处理
对于其他平台如iOS/Android原生App,可以使用相应的录音API,但整体流程类似。
5.2 语音识别服务选择
在实际部署时,语音识别服务的选择需要考虑以下因素:
- 识别准确率:特别是对餐饮相关词汇的识别能力
- 响应速度:用户期待实时反馈
- 成本考量:按调用量计费还是固定费用
- 隐私保护:是否支持数据不落盘处理
常见的ASR服务提供商包括阿里云、讯飞、百度等,各有优势。对于初期验证,可以使用各家的免费额度;对于生产环境,建议进行详细的性能测试和成本评估。
6. 安全与合规设计
6.1 关键风险与应对措施
在开发涉及交易的AI系统时,安全与合规是首要考虑。本方案针对主要风险设计了以下防护措施:
| 风险类型 | 解决方案 | 技术实现 |
|---|---|---|
| 未经同意下单 | 强制用户确认 | 订单预览工具+确认机制 |
| 隐私泄露 | 最小化数据保留 | 会话结束后清除上下文 |
| 支付安全 | 不处理真实支付 | 仅生成跳转链接 |
| 幻觉下单 | 严格参数校验 | 工具内部白名单检查 |
| 审计追踪 | 完整日志记录 | 记录所有工具调用 |
6.2 合规实现细节
系统特别注重符合《生成式人工智能服务管理暂行办法》的要求,主要体现在:
- 用户确认机制:generate_order_preview工具生成的预览信息必须包含所有关键订单详情,并明确要求用户确认
- 数据最小化:不存储用户语音原始数据,仅保留必要的文本交互记录
- 操作可逆:在最终确认前,用户可随时取消或修改订单
- 透明性:系统明确告知用户它是辅助工具,最终操作需在官方App完成
这些措施不仅满足法规要求,也建立了用户信任,是AI应用长期发展的基础。
7. 部署方案与测试建议
7.1 后端服务部署
系统后端采用Python FastAPI框架,部署简单高效:
python复制# 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"]}
部署命令非常简单:
bash复制pip install fastapi uvicorn langchain-openai
uvicorn main:app --reload
对于生产环境,建议:
- 使用Gunicorn作为ASGI服务器
- 配置合适的worker数量
- 添加API网关处理认证和限流
- 设置完善的监控和告警
7.2 测试策略建议
为确保系统可靠性,建议实施多层次的测试:
- 单元测试:针对每个工具函数编写测试用例
- 集成测试:验证Agent与工具的协同工作
- 端到端测试:模拟完整用户流程
- 负向测试:测试错误输入和边界情况
特别需要重点测试的场景包括:
- 模糊的商品描述
- 冲突的定制要求(如"超辣"但"不要辣")
- 不存在的商品请求
- 语音识别错误的情况
- 网络不稳定的恢复能力
8. 扩展方向与优化建议
8.1 功能扩展思路
当前系统作为基础实现,可以朝多个方向扩展:
- 多店铺支持:扩展商品数据库,增加搜索维度
- 个性化推荐:基于用户历史订单推荐商品
- 地址管理:集成地理位置API获取配送地址
- 优惠券应用:支持自动选择最优优惠方案
- 多轮对话:支持订单修改和追加商品
8.2 性能优化建议
随着系统复杂度增加,需要考虑以下优化:
- 工具缓存:对商品搜索等工具添加缓存层
- 异步执行:对独立工具调用采用异步方式
- LLM优化:使用更高效的模型或提示工程
- 批量处理:支持同时处理多个用户请求
这些扩展和优化可以使系统从原型阶段逐步演进为生产级应用。
9. 实操心得与避坑指南
在实际开发这类AI应用时,我总结了以下几点经验:
-
工具设计要原子化:每个工具应只做一件事,保持简单。初期我曾尝试将搜索和购物车合并,结果导致逻辑复杂难以维护。
-
参数校验要严格:对工具输入必须做严格校验。有次测试时用户说"变态辣",系统因没有这个选项而崩溃,后来添加了白名单校验。
-
用户确认环节必不可少:早期版本尝试自动下单,结果因语音识别错误导致错误订单。加入确认环节后问题解决。
-
日志要详尽:完善的日志在调试复杂Agent流程时至关重要。建议记录每个工具调用的输入输出。
-
性能监控要提前规划:Agent系统可能产生多次LLM调用,需要监控延迟和成本。我曾遇到因未限制迭代次数导致的无限循环。
这些经验教训希望能帮助开发者少走弯路,更高效地构建可靠的AI应用。
