AI Agent白手起家21: LangChain 大模型组件标准参数与事件驱动实战

纲要

  • 标准参数配置
    • modeltemperaturetimeoutmax_tokensstopmax_retriesapi_keybase_urlrate_limit
    • 参数效果对比(temperaturestop 示例)
  • 标准事件驱动
    • invoke:同步调用
    • stream:流式输出
    • batch:批量处理
    • astream_events:异步事件流
    • bind_tools:工具绑定
    • with_structured_output:结构化输出
    • 其他事件(with_retrywith_fallbackconfigure
  • 消息格式
    • OpenAI 消息 vs LangChain 消息
    • AIMessage 关键字段解析
  • 完整可运行代码演示

标准参数详解

实例化大模型组件时,LangChain 提供了一系列标准参数。所有官方合作包(如 langchain-openai)均强制使用这些参数名,而社区包不保证一致性。

参数类型说明
modelstr模型名称,必填。不同厂商提供多种模型,按需选择。
temperaturefloat (0~1)控制生成随机性。越小越确定性,越大越有创造力。一般 0.7 以上偏向创意,0.3 以下严格遵循指令。API 数据生成推荐设为 0。
timeoutint单次 API 请求超时秒数。
max_tokensint单次输出的最大 token 数。
stopstr 或 list[str]停止符,模型输出遇到该字符串立即终止。不指定时可能默认 \n
max_retriesintAPI 调用失败后的最大重试次数。
api_keystr厂商 API 密钥,建议从环境变量读取。
base_urlstr代理地址,用于自定义 API 端点。
rate_limitfloat请求速率限制(每秒请求数),避免被厂商封禁。

重要提醒

  • 标准参数仅对厂商 API 实际开放的参数有效,部分模型可能不支持 max_tokens 等。
  • 社区包不一定遵守这些参数名,使用前需查阅对应文档。

下面通过代码直观感受 temperaturestop 的影响:

import os
from langchain_openai import ChatOpenAI

# 基础配置
llm = ChatOpenAI(
    model="gpt-4",
    api_key=os.getenv("OPENAI_API_KEY"),
    temperature=0.4,
    timeout=30,
    max_tokens=200,
    max_retries=3
)

prompt = "用一句话介绍一下你自己。"

# 默认 temperature=0.4 的输出
print("=== temperature=0.4 ===")
res = llm.invoke(prompt)
print(res.content)

# 调高 temperature
llm_creative = ChatOpenAI(
    model="gpt-4",
    api_key=os.getenv("OPENAI_API_KEY"),
    temperature=0.9,
    max_tokens=200
)
print("\n=== temperature=0.9 ===")
res_creative = llm_creative.invoke(prompt)
print(res_creative.content)

# stop 参数:遇到“我”停止
llm_stop = ChatOpenAI(
    model="gpt-4",
    api_key=os.getenv("OPENAI_API_KEY"),
    temperature=0.4,
    max_tokens=200,
    stop=["我"]
)
print("\n=== stop='我' ===")
res_stop = llm_stop.invoke(prompt)
print(res_stop.content)

运行结果对比:

  • temperature=0.4 时回答偏向严谨规范。
  • temperature=0.9 时回答风格更自由、更具创造性。
  • 启用 stop="我" 后,输出在第一个“我”字处截断,仅返回“作为一个人工智能,”。

标准事件驱动模型交互

LangChain 将大模型操作抽象为标准事件,开发者无需关心底层 API 差异。

下面使用 Mermaid 时序图展示核心事件调用流程:

ChatModelAppChatModelApploop[流式生成]invoke(prompt)完整 AIMessagestream(prompt)chunk (content片段)batch([q1, q2])[AIMessage1, AIMessage2]astream_events(prompt, version="v2")on_chat_model_starton_chat_model_stream (chunks)on_chat_model_end (完整结果)with_structured_output(Schema).invoke(prompt)Pydantic 模型实例

invoke - 同步调用

最基础的调用方式,返回完整 AIMessage。适合后台任务、批处理脚本。

stream - 流式输出

逐 token 返回,前端实现打字机效果,提升交互体验。使用 for 循环读取 chunk.content

batch - 批量处理

传入多个提示词,并发请求,统一返回结果列表。适合离线评估、数据增强。

astream_events - 异步事件流

基于异步的流式输出,可按事件类型精细控制。需要 async forversion="v2"。常见事件:

  • on_chat_model_start:模型开始响应
  • on_chat_model_stream:流式输出中
  • on_chat_model_end:响应结束,可获取完整结果及 token 统计

bind_tools - 绑定工具

将自定义工具(函数)绑定到模型,使其具备调用外部 API 的能力。这是构建 Agent 的关键步骤。

with_structured_output - 结构化输出

让模型按照指定的 Pydantic 模型输出 JSON 结构,避免正则解析,直接传递到下游函数。也支持 stream 模式。

其他事件:with_retry(失败重试)、with_fallback(降级策略)、configure(运行时参数调整)等。

消息格式与 AIMessage 字段

ChatModels 支持两种消息格式:

格式常用消息类
OpenAI 格式system, user, assistant, 多模态消息
LangChain 格式SystemMessage, HumanMessage, AIMessage, ToolMessage, AIMessageChunk, RemoveMessage

推荐统一使用 LangChain 消息格式,因为它更全面且为官方推荐。特别是 ToolMessage,在大模型调用工具后承载返回数据。

大模型返回的 AIMessage 对象包含以下关键属性:

  • content:模型响应文本(可能是字符串或内容块列表)。
  • tool_calls:标准化后的工具调用请求。
  • invalid_tool_calls:无效的工具调用记录。
  • usage_metadata:输入/输出 token 使用量统计。
  • id:消息唯一标识。
  • response_metadata:厂商原始响应头、token 计数等。

不同模型返回的原生字段并不统一,LangChain 仅对部分做了标准化,实际开发需留意厂商差异。

完整可运行示例

以下代码整合了标准参数、六大核心事件(invokestreambatchastream_eventswith_structured_outputbind_tools 的简介)以及消息格式演示。运行前请设置环境变量 OPENAI_API_KEY,并安装依赖:

pip install langchain-openai pydantic
import os, asyncio
from pydantic import BaseModel, Field
from langchain_openai import ChatOpenAI

# ---------- 1. 标准参数配置 ----------
llm = ChatOpenAI(
    model="gpt-4",
    temperature=0.4,
    timeout=30,
    max_tokens=200,
    max_retries=3,
    api_key=os.getenv("OPENAI_API_KEY"),
    # base_url="https://your-proxy.com/v1",  # 如需代理
)

# ---------- 2. invoke:同步调用 ----------
print("=== invoke ===")
result = llm.invoke("用一句话介绍一下你自己。")
print(result.content)
print("\nToken 用量:", result.usage_metadata)

# ---------- 3. stream:流式输出 ----------
print("\n=== stream ===")
for chunk in llm.stream("背诵一首七言绝句"):
    print(chunk.content, end="", flush=True)
print()

# ---------- 4. batch:批量处理 ----------
print("\n=== batch ===")
questions = ["AI Agent 的核心是什么?", "LangChain 由哪些组件构成?"]
results = llm.batch(questions)
for q, r in zip(questions, results):
    print(f"Q: {q}\nA: {r.content}\n")

# ---------- 5. astream_events:异步事件流 ----------
async def demo_astream_events():
    print("=== astream_events ===")
    async for event in llm.astream_events("介绍下深度学习", version="v2"):
        ev = event["event"]
        if ev == "on_chat_model_start":
            print("[模型开始]")
        elif ev == "on_chat_model_stream":
            data = event["data"]["chunk"]
            if data.content:
                print(data.content, end="", flush=True)
        elif ev == "on_chat_model_end":
            final = event["data"]["output"]
            print(f"\n[模型结束] token 用量: {final.usage_metadata}")
asyncio.run(demo_astream_events())

# ---------- 6. with_structured_output:结构化输出 ----------
class MovieReview(BaseModel):
    """电影评论输出格式"""
    title: str = Field(description="电影名称")
    summary: str = Field(description="一句话剧情简介")
    score: float = Field(description="评分,1-10 分")

structured_llm = llm.with_structured_output(MovieReview)
review = structured_llm.invoke("用结构化数据介绍电影《流浪地球》")
print("\n=== structured output ===")
print(f"电影: {review.title}\n简介: {review.summary}\n评分: {review.score}")

# ---------- 7. bind_tools 演示(轻量示例) ----------
def get_weather(city: str) -> str:
    """模拟天气查询"""
    return f"{city} 晴天,22°C"

llm_with_tools = llm.bind_tools([get_weather])
tool_result = llm_with_tools.invoke("北京今天天气怎么样?")
print("\n=== bind_tools ===")
print(tool_result.content)  # 模型会尝试返回调用工具的信息

小结与最佳实践

  • 优先使用 ChatModels 和官方合作包,避免直接使用原生 SDK。
  • 必须设置的参数:modeltemperatureapi_key
  • 交互式应用首选 stream;需要后台处理时用 invokebatch;需要精细控制流式输出时用 astream_events
  • 对接下游系统(如数据库、前端组件)时,务必使用 with_structured_output 保证数据格式稳定。
  • 注意 AIMessage 中的 usage_metadata,可用于成本监控和用量控制。
  • 不同模型的原生字段差异需在实践中积累,做好字段兼容处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值