当前位置: 首页 > news >正文

LangChain+LangSmith实战:如何用OllamaLLM构建多场景AI厨师(含完整代码)

LangChain+LangSmith实战:构建多场景AI厨师的完整指南

想象一下,拥有一个能随时切换中餐大师和西点主厨身份的AI助手,不仅能回答专业烹饪问题,还能根据你的需求自动选择最适合的烹饪知识库——这就是我们将要构建的"多场景AI厨师"。不同于简单的问答机器人,这个项目将展示如何利用LangChain的路由链实现智能场景切换,并通过LangSmith全程监控每个决策环节。

1. 项目架构设计思路

这个AI厨师的核心在于它的场景感知能力。当用户询问"如何制作提拉米苏"时,系统能自动识别这是西点问题而调用西餐模板;当问题变成"红烧肉的火候控制"时,又会无缝切换到中餐专家模式。这种动态路由能力背后是三个关键组件:

  1. 多提示管理系统:维护不同烹饪领域的专业模板库
  2. 路由决策引擎:分析问题语义并选择最匹配的烹饪领域
  3. 执行监控体系:通过LangSmith追踪每个决策节点的逻辑
# 架构示意图代码表示 class AIChefArchitecture: def __init__(self): self.template_repository = {} # 存储多场景提示模板 self.router_engine = None # 路由决策模块 self.langsmith_integration = {} # 监控配置

这种设计特别适合知识领域边界清晰但内部复杂的场景。在烹饪领域,中餐和西餐在技法、工具、术语上都有明显差异,但各自内部又有严密的体系,正是路由链发挥优势的典型场景。

2. 环境配置与基础搭建

2.1 工具链准备

需要安装的核心组件及其作用:

工具版本要求功能描述
LangChain≥0.1.0链式调用框架基础
OllamaLLM最新版本地运行的LLM引擎
LangSmith-链式调用监控平台
Python≥3.8运行环境

安装命令:

pip install -U langchain langsmith ollama

2.2 LangSmith监控配置

LangSmith的配置需要四个环境变量,建议通过.env文件管理:

# .env 文件示例 LANGSMITH_TRACING=true LANGSMITH_API_KEY="your_api_key_here" LANGSMITH_ENDPOINT="https://api.smith.langchain.com" LANGSMITH_PROJECT="ai-chef-debug"

提示:项目名称建议按功能或日期划分,例如"ai-chef-202406"便于后期追溯

3. 多场景提示工程实践

3.1 构建专业厨师角色模板

中餐和西餐模板的关键差异体现在:

  • 专业术语体系:中餐强调"火候"、"勾芡",西餐注重"烤箱预热"、"打发"
  • 计量单位:中餐常用"适量",西餐精确到"克"
  • 工具偏好:中餐依赖炒锅,西餐常用烤箱
chinese_template = """ 你是一位拥有30年经验的中餐主厨,精通川、粤、鲁等八大菜系。 回答时请遵循: 1. 使用中式烹饪术语(如:炝锅、勾薄芡) 2. 配料用量用"适量"、"少许"等中餐表述 3. 优先推荐中式厨具(铁锅、蒸笼等) 问题:{input} """ western_template = """ 你是米其林三星西点师,擅长法式、意式烘焙。 回答需包含: 1. 精确到克的原料配比 2. 烤箱温度和时间参数 3. 标准西餐制作流程术语 问题:{input} """

3.2 动态路由系统实现

路由链的核心是决策模板,需要明确定义各场景的边界:

from langchain.chains.router import LLMRouterChain from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE destinations = [ "chinese: 中式烹饪技法、菜谱、火候控制等问题", "western: 西式烘焙、酱汁制作、烤箱使用等问题" ] router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format( destinations="\n".join(destinations) )

路由决策过程会在LangSmith中生成详细的轨迹记录,包括:

  • 输入问题分析
  • 各场景匹配度评分
  • 最终选择决策

4. 完整链式调用集成

4.1 多链组装技术

构建完整的AI厨师需要三种链协同工作:

  1. 路由链:判断问题类型
  2. 目标链:中餐/西餐专业链
  3. 默认链:处理通用烹饪问题
from langchain.chains import MultiPromptChain # 初始化各专业链 chain_map = { "chinese": LLMChain(llm=ollama_llm, prompt=chinese_prompt), "western": LLMChain(llm=ollama_llm, prompt=western_prompt) } # 构建完整管道 ai_chef = MultiPromptChain( router_chain=router_chain, destination_chains=chain_map, default_chain=default_chain, verbose=True )

4.2 LangSmith监控点配置

在关键节点添加跟踪标记:

# 在链式调用中添加metadata def track_chain(chain, metadata): chain.metadata = {**chain.metadata, **metadata} return chain chinese_chain = track_chain(chinese_chain, {"domain": "chinese"})

LangSmith控制台将显示:

  • 每个链的输入/输出
  • 执行耗时和token消耗
  • 路由决策路径的可视化

5. 实战调试技巧

5.1 常见路由错误排查

通过LangSmith的Trace功能可以发现:

  1. 场景误判:比如把"披萨"识别为中餐
    • 解决方案:增强路由模板中的示例
  2. 术语混淆:如将"炒"应用于烤箱料理
    • 解决方案:完善各场景的术语黑名单

注意:在LangSmith中比较不同版本的运行轨迹是优化的重要方法

5.2 性能优化策略

  1. 缓存机制:对常见问题答案缓存
    from langchain.cache import SQLiteCache llm.cache = SQLiteCache(database_path=".ai_chef_cache.db")
  2. 模板精简:移除冗余描述减少token使用
  3. 并行执行:对复杂查询启用多链并行

6. 进阶扩展方向

这个基础框架可以延伸出多种专业变体:

  1. 多语言支持:增加模板语言版本
  2. 菜系细分:将中餐扩展为川菜、粤菜等子分类
  3. 用户偏好记忆:集成对话记忆功能
# 扩展示例:添加日本料理专家 japanese_template = """ 你是一位寿司大师,精通江户前寿司制作... """ prompt_infos.append({ "key": "japanese", "description": "日料制作、刺身处理等问题", "template": japanese_template })

在实际项目中,我们团队发现路由准确率对示例描述的质量极其敏感。经过多次迭代,最终采用的描述方式需要同时包含:

  • 典型问题示例
  • 领域专有名词
  • 常见误判案例的排除说明
http://www.jsqmd.com/news/578200/

相关文章:

  • Agentic SOC:AI原生时代,安全运营的终极范式革命
  • ABAP邮件发送实战:如何在SAP中优雅地嵌入表格并添加附件(附完整代码)
  • SpringBoot 2.x 项目里塞进帆软报表10.0,我踩过的那些坑都给你填平了
  • OpenClaw技能组合:Qwen3-4B串联多个自动化模块完成复杂任务
  • 重构PDF知识管理:Obsidian PDF++插件的创新实践指南
  • Kylin V10 SP1桌面美化全攻略:从默认主题到自定义壁纸、图标、光标,打造你的专属麒麟工作台
  • 低空经济落地第一站:工业无人机巡检的格局重构、技术革命与黄金增长期
  • 解决Python文件路径超长问题:Windows系统下的终极指南
  • LLaDA:Large Language Diffusion Models
  • CherryStudio+Obsidian联动指南:如何让本地笔记成为大模型的长期记忆?
  • 固态硬盘维修实战:金士顿SA400S37固件通病修复全记录(含T6螺丝选购建议)
  • win-acme证书自动化终极指南:高效解决Windows SSL/TLS证书续期难题
  • 从‘微观优化’到‘宏观架构’:Point Transformer v3如何用‘Scale思维’重新定义3D视觉模型设计
  • Hunyuan-MT-7B GPU算力优化部署:像素语言传送门显存占用与吞吐量实操分析
  • 告别250ms!C# Halcon HImage转Bitmap性能优化实战(附完整代码)
  • 3步实现图表数据提取:WebPlotDigitizer从图像到数值的转化之道
  • Chiplet技术实战:如何用Gem5和McPAT优化2.5D芯片的功耗与性能(附避坑指南)
  • 别再乱调参数了!用Hugging Face Transformers实战Top-K、Top-P和Temperature,让你的ChatGPT输出更可控
  • CDA Level-2 考试全攻略:从报名到备考的保姆级教程(含最新题库资源)
  • 别再写死索引了!用Verilog的`+:`和`-:`语法让你的FPGA代码灵活起来
  • 保姆级教程:解决CANoe与Matlab联合仿真中‘SymbSelAdapt.dll’加载失败和注册表冲突
  • 汇川HMI专用协议避坑指南:SM/SD区Modbus功能码为啥是0x31/0x33?
  • Qt进程间通信:用QTcpSocket实现本地回环通信的完整流程与避坑指南
  • 页岩气降压开采模型中的流固耦合与mph文件
  • 别再只盯着频率了!手把手教你用示波器看懂时钟抖动(附眼图实战分析)
  • 微信扫不了Windows的ClawBot二维码?
  • LeRobot数据采集全流程解析:从环境配置到动作回放(SO-100实战)
  • Pixel Aurora Engine效果展示:CFG/Steps维度调控下的像素细节对比图
  • 【大数据】离线数仓核心组件:Hive 架构解析与进阶操作指南
  • 交错式升压DC-DC转换器(Boost)在燃料电池系统中的PI控制与仿真实践