纲要
- 标准参数配置
model、temperature、timeout、max_tokens、stop、max_retries、api_key、base_url、rate_limit- 参数效果对比(
temperature与stop示例)
- 标准事件驱动
invoke:同步调用stream:流式输出batch:批量处理astream_events:异步事件流bind_tools:工具绑定with_structured_output:结构化输出- 其他事件(
with_retry、with_fallback、configure)
- 消息格式
- OpenAI 消息 vs LangChain 消息
AIMessage关键字段解析
- 完整可运行代码演示
标准参数详解
实例化大模型组件时,LangChain 提供了一系列标准参数。所有官方合作包(如 langchain-openai)均强制使用这些参数名,而社区包不保证一致性。
| 参数 | 类型 | 说明 |
|---|---|---|
model | str | 模型名称,必填。不同厂商提供多种模型,按需选择。 |
temperature | float (0~1) | 控制生成随机性。越小越确定性,越大越有创造力。一般 0.7 以上偏向创意,0.3 以下严格遵循指令。API 数据生成推荐设为 0。 |
timeout | int | 单次 API 请求超时秒数。 |
max_tokens | int | 单次输出的最大 token 数。 |
stop | str 或 list[str] | 停止符,模型输出遇到该字符串立即终止。不指定时可能默认 \n。 |
max_retries | int | API 调用失败后的最大重试次数。 |
api_key | str | 厂商 API 密钥,建议从环境变量读取。 |
base_url | str | 代理地址,用于自定义 API 端点。 |
rate_limit | float | 请求速率限制(每秒请求数),避免被厂商封禁。 |
重要提醒:
- 标准参数仅对厂商 API 实际开放的参数有效,部分模型可能不支持
max_tokens等。 - 社区包不一定遵守这些参数名,使用前需查阅对应文档。
下面通过代码直观感受 temperature 与 stop 的影响:
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 时序图展示核心事件调用流程:
invoke - 同步调用
最基础的调用方式,返回完整 AIMessage。适合后台任务、批处理脚本。
stream - 流式输出
逐 token 返回,前端实现打字机效果,提升交互体验。使用 for 循环读取 chunk.content。
batch - 批量处理
传入多个提示词,并发请求,统一返回结果列表。适合离线评估、数据增强。
astream_events - 异步事件流
基于异步的流式输出,可按事件类型精细控制。需要 async for 和 version="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 仅对部分做了标准化,实际开发需留意厂商差异。
完整可运行示例
以下代码整合了标准参数、六大核心事件(invoke、stream、batch、astream_events、with_structured_output、bind_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。 - 必须设置的参数:
model、temperature、api_key。 - 交互式应用首选
stream;需要后台处理时用invoke或batch;需要精细控制流式输出时用astream_events。 - 对接下游系统(如数据库、前端组件)时,务必使用
with_structured_output保证数据格式稳定。 - 注意
AIMessage中的usage_metadata,可用于成本监控和用量控制。 - 不同模型的原生字段差异需在实践中积累,做好字段兼容处理。

2401

被折叠的 条评论
为什么被折叠?



