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

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要

  • 练习目标:掌握大模型标准事件的调用
  • 回顾 LangChain 中的核心标准事件
    • invoke
    • stream
    • batch
    • astream_events
    • with_structured_output
  • 环境准备
  • 实战代码:多种事件调用对比
    • 同步调用与流式输出
    • 批量处理
    • 异步事件流监听
    • 结构化输出
  • 运行说明与预期结果
  • 总结与扩展建议

练习目标

在学习完大模型组件的理论知识后,动手实践是巩固的最佳途径。本次练习的目标是:使用任意已申请到的大模型资源(无论来自 OpenAI、DeepSeek、Anthropic 等云端 API,还是通过 Ollama 运行的本地模型),通过 LangChain 的标准事件接口来驱动模型,实际感受不同调用方式的行为差异。

你将学会如何优雅地切换同步调用、流式输出、批量处理、异步事件流以及结构化输出,为后续开发 AI Agent 打下坚实基础。

核心标准事件回顾

LangChain 对大模型组件抽象了统一的调用接口,下表对比了最常用的五种事件:

事件调用方式适用场景返回类型
invoke同步阻塞,返回完整结果后台任务、批处理脚本AIMessage
stream同步迭代,逐 token 产出聊天机器人前端、实时反馈Iterator[chunk]
batch并发发送多个请求批量评估、数据增强list[AIMessage]
astream_events异步流式,按事件类型精细控制需要监听开始/结束/流式进度AsyncIterator[event]
with_structured_output基于 Pydantic 模型的结构化输出下游系统对接、JSON 解析Pydantic 实例

下面的流程图展示了从调用到输出的决策路径:

开始调用

需要流式?

需要结构化输出?

使用 invoke

使用 with_structured_output + invoke

需要异步事件?

使用 stream

使用 astream_events

返回完整 AIMessage

逐 chunk 输出

按事件回调

环境准备

本示例使用 OpenAI 的 GPT-3.5-turbo 模型(成本较低,适合练习)。请先安装依赖并设置 API 密钥。

pipinstalllangchain-openai pydantic

确保环境变量OPENAI_API_KEY已设置为你的有效密钥。若使用本地模型(如 Ollama),可将ChatOpenAI替换为ChatOllama,并修改base_url即可。

实战代码:一次演示所有事件

以下代码将连续演示invokestreambatchastream_eventswith_structured_output五种调用方式。

importos,asynciofrompydanticimportBaseModel,Fieldfromlangchain_openaiimportChatOpenAI# ---------- 初始化模型 ----------llm=ChatOpenAI(model="gpt-3.5-turbo",temperature=0.7,api_key=os.getenv("OPENAI_API_KEY"),)# ---------- 1. invoke:同步调用 ----------print("=== 1. invoke 同步调用 ===")response=llm.invoke("用一句话介绍 Python 语言")print("完整回答:",response.content)print("Token 用量:",response.usage_metadata)print()# ---------- 2. stream:流式输出 ----------print("=== 2. stream 流式输出 ===")print("模型输出: ",end="",flush=True)forchunkinllm.stream("写一首关于编程的七言绝句"):print(chunk.content,end="",flush=True)print("\n")# ---------- 3. batch:批量处理 ----------print("=== 3. batch 批量处理 ===")questions=["什么是上下文窗口?","Token 是什么?","工具调用有什么作用?"]results=llm.batch(questions)forq,rinzip(questions,results):print(f"Q:{q}\nA:{r.content}\n")# ---------- 4. astream_events:异步事件流 ----------asyncdefdemo_astream_events():print("=== 4. astream_events 异步事件流 ===")asyncforeventinllm.astream_events("解释什么是深度学习",version="v2"):kind=event["event"]ifkind=="on_chat_model_start":print("[模型开始响应]")elifkind=="on_chat_model_stream":data=event["data"]["chunk"]ifdata.content:print(data.content,end="",flush=True)elifkind=="on_chat_model_end":print("\n[模型响应结束]")output=event["data"]["output"]ifoutput.usage_metadata:print("Token 用量:",output.usage_metadata)asyncio.run(demo_astream_events())print()# ---------- 5. with_structured_output:结构化输出 ----------print("=== 5. with_structured_output 结构化输出 ===")classProgrammingJoke(BaseModel):"""程序员笑话"""setup:str=Field(description="笑话的铺垫")punchline:str=Field(description="笑话的包袱/笑点")rating:int|None=Field(default=None,description="好笑程度 1-10")structured_llm=llm.with_structured_output(ProgrammingJoke)joke=structured_llm.invoke("给我讲一个编程相关的笑话")print(f"铺垫:{joke.setup}")print(f"笑点:{joke.punchline}")print(f"评分:{joke.rating}")

将以上代码保存为practice.py,运行后你将直观看到每种事件的特点:

  • invoke等待完整回复后一次性打印。
  • stream逐字出现,模拟打字机效果。
  • batch同时发送三个问题,按列表顺序返回答案。
  • astream_events在流式输出的前后触发了开始和结束事件,并报告了 Token 用量。
  • with_structured_output返回了一个可直接读属性的 Pydantic 对象,无需手动解析 JSON。

扩展建议

  • 尝试替换模型:将ChatOpenAI改为ChatAnthropic(需要langchain-anthropic)或ChatOllama,看看事件支持是否一致。
  • batch处理加入进度条(使用tqdm),提升批处理体验。
  • astream_events中捕获更多事件类型(如on_chat_model_stream的详细元数据),实现自定义日志记录。
  • 结合之前学习的工具调用(bind_tools),在stream模式下处理工具请求,构建更真实的 Agent 交互。

动手练习是内化知识的最佳方式,尝试修改代码、切换模型、观察输出差异,你会对大模型的标准事件有更深刻的理解。

http://www.jsqmd.com/news/1323083/

相关文章:

  • Tartelet 新手入门:5 分钟快速搭建你的第一个 GitHub Actions 虚拟运行器
  • Windows 10系统下JDK 8安装与环境变量配置全攻略
  • SysML v2 API完全解析:如何利用编程接口扩展系统建模能力
  • 2026年天津遗产继承避坑指南 赵天亮等5位律师放心选 - 本地品牌推荐
  • clusterd指纹识别引擎解析:如何精准识别JBoss、Tomcat等应用服务器版本
  • RDPWrap完整配置指南:轻松解锁Windows远程桌面多用户连接
  • RAG系统效果迭代实战:从80%准确率到精准优化的破局之路
  • 2026佛山防水补漏全攻略|卫生间免砸砖补漏 阳台渗水维修 外墙飘窗防水 屋顶翻新 地下室堵漏 正规公司推荐 - 房屋-修缮
  • OTT在计算机视觉中的应用:图像配准与风格迁移的最优传输方案
  • DeepSeekFanyi批量公式翻译技术解析与实践
  • 网安学习避坑大全:100%新人都会踩的进阶误区,越早戒掉进步越快
  • Lichtblick核心功能详解:从数据可视化到实时诊断的7大实用工具
  • OpenCV图像处理实战:玉米粒自动计数技术详解
  • 企业微信Go开发终极指南:go-workwx助你快速构建高效办公应用
  • 2026抚州卫生间防水服务商大盘点:正规合规实力过硬服务商筛选指南 附全流程避坑FAQ与选型参考 - U渠道
  • 从Grok 36小时极限开发看AI应用快速构建与取舍
  • UnityNativeCamera核心功能解析:拍照、录像、缩略图生成全攻略
  • 孕妇用妊娠油推荐|8 款热门孕妇用妊娠油深度测评,孕妇用妊娠油首选福来 - 甄选测评馆
  • 从Grok 36小时极限开发看AI产品原型验证:RAG、vLLM与工程取舍
  • 恶少说说 - 原来爱与包容才是文明
  • 量子计算如何革新非绝热分子动力学模拟:从原理到混合计算范式
  • OpenCV图像分割与轮廓检测实战:玉米粒计数项目全解析
  • FunASR INT8量化技术解析:如何实现语音识别模型70%体积压缩与精度无损优化
  • REFramework终极实战手册:从零开始打造你的RE引擎游戏模组
  • 3个惊艳技巧:让你的开源白板工具体验焕然一新
  • 从英雄选择到游戏结束:League Akari让你的英雄联盟体验提升3倍的终极指南
  • 2026年婴儿洗沐二合一推荐:五款热门产品成分与体感实测,帮你跳过选品弯路 - 甄选测评馆
  • 上海GEO代运营服务选型全指南:中小微企业对比参考 - 筑云鲸
  • 单文件深度强化学习框架CleanRL:从入门到精通的终极指南
  • MapView开发指南:自定义图层开发全流程,从BitmapLayer到RouteLayer