LangChain教程:ChatOpenAI详解

介绍

ChatOpenAI 是 LangChain 对接 OpenAI 对话模型(gpt-3.5-turbo、gpt-4、gpt-4o 等) 的核心聊天模型类,专门处理对话式交互,区别于老版 OpenAI(文本补全模型)。

基础用法

1. 基础调用(单轮对话)

from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import os

# 加载环境变量
load_dotenv()

# 1. 初始化 ChatOpenAI
llm = ChatOpenAI(
    model="gpt-3.5-turbo",  # 模型名,必填
    temperature=0.7,        # 随机性 0~2,越低越严谨
    max_tokens=1024,        # 最大生成长度
)

# 2. 调用模型(字符串输入)
res = llm.invoke("简单介绍一下 LangChain")
print(res.content)  # 取出回答文本

2. 消息对象模式(标准对话格式)

OpenAI 接口原生支持角色消息,LangChain 封装了 HumanMessage/AIMessage/SystemMessage:

from langchain_core.messages import SystemMessage, HumanMessage

# 系统提示 + 用户提问
messages = [
    SystemMessage(content="你是一名专业Python讲师,回答简洁易懂"),
    HumanMessage(content="解释什么是装饰器")
]

res = llm.invoke(messages)
print(res.content)

初始化参数

必选/高频参数

参数 作用 取值说明
model 指定模型名称 gpt-3.5-turbo / gpt-4 / gpt-4o / gpt-4-turbo
api_key OpenAI Key 不传则读取环境变量 OPENAI_API_KEY
base_url 接口代理地址 对接中转/本地兼容接口时使用
temperature 温度 0=精准、逻辑强;1=创意强;代码/问答建议 0~0.3
top_p 核采样 和 temperature 二选一,默认1.0
max_tokens 最大输出token 限制回答长度,避免超长返回
timeout 超时时间 单位秒,网络差必设:timeout=30
streaming 流式输出开关 True 开启逐字返回,配合 stream() 使用
presence_penalty 存在惩罚 -2~2,越高越容易开启新话题
frequency_penalty 频率惩罚 -2~2,越高越避免重复语句

完整初始化示例

llm = ChatOpenAI(
    model="gpt-3.5-turbo",
    api_key="sk-xxx",
    base_url="https://api.proxy.com/v1",
    temperature=0.2,
    max_tokens=2048,
    timeout=20,
    streaming=False,
    presence_penalty=0.1,
    frequency_penalty=0.1
)

四大调用方式

1. invoke 同步单次调用(最常用)

阻塞等待完整结果返回,适合常规业务:

res = llm.invoke("你好")
# 返回值是 AIMessage 对象
print(type(res))
print("回答:", res.content)
# 额外元数据(token消耗、模型名等)
print("元数据:", res.response_metadata)

2. batch 批量调用

一次性传入多个问题,批量获取结果,效率更高:

queries = ["1+1等于几", "介绍Python", "什么是大模型"]
results = llm.batch(queries)

for idx, res in enumerate(results):
    print(f"问题{idx+1}:{res.content}")

3. stream 流式输出(打字机效果)

对话/聊天场景首选,需开启 streaming=True:

llm_stream = ChatOpenAI(model="gpt-3.5-turbo", streaming=True)

# 逐块迭代输出
for chunk in llm_stream.stream("写一段100字的春天文案"):
    print(chunk.content, end="", flush=True)

4. 异步调用 ainvoke / astream

高并发场景(接口服务、后端)使用,不阻塞事件循环:

import asyncio

async def async_call():
    llm = ChatOpenAI(model="gpt-3.5-turbo")
    res = await llm.ainvoke("异步调用测试")
    print(res.content)

asyncio.run(async_call())

结合 Prompt 模板

实际项目不会硬编码提示词,搭配 ChatPromptTemplate 动态构造对话:

from langchain_core.prompts import ChatPromptTemplate

# 1. 定义提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是{role},回答风格{style}"),
    ("user", "{question}")
])

# 2. 模板 + 模型 串联(LangChain 链式语法)
chain = prompt | llm

# 3. 传入变量执行
res = chain.invoke({
    "role": "技术顾问",
    "style": "专业严谨",
    "question": "如何优化接口响应速度"
})
print(res.content)

上下文记忆(多轮对话)

实现连续聊天、保留历史对话,搭配 MessagesPlaceholder + 记忆组件:

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

# 1. 提示模板(预留历史消息位置)
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是聊天助手"),
    MessagesPlaceholder(variable_name="history"),  # 存放历史对话
    ("user", "{input}")
])

chain = prompt | llm

# 2. 本地内存存储对话历史
history = ChatMessageHistory()
chat_chain = RunnableWithMessageHistory(
    chain,
    get_session_history=lambda session_id: history,
    input_messages_key="input",
    history_messages_key="history"
)

# 3. 多轮对话
chat_chain.invoke({"input": "我叫小明"}, config={"session_id": "123"})
res = chat_chain.invoke({"input": "我叫什么名字?"}, config={"session_id": "123"})
print(res.content)  # 正确记住名字

常见问题与踩坑

1. 代理/中转接口报错

现象:连接超时、401/404
解决:

  • 手动指定 base_url,结尾必须带 /v1
  • 检查 api_key 正确性
  • 网络开启全局代理

2. Token 超限

现象:context length exceeded
解决:

  • 减小 max_tokens
  • 截断历史对话、精简提示词
  • 改用长上下文模型(如 gpt-3.5-turbo-16k)

3. 新版导入报错(旧代码兼容)

旧版 from langchain.chat_models import ChatOpenAI 已废弃
✅ 新版正确导入:

from langchain_openai import ChatOpenAI

4. 流式不生效

检查初始化是否设置 streaming=True,且必须使用 .stream() 方法。


和旧版 OpenAI 类区别

  1. ChatOpenAI:面向对话模型(gpt-3.5-turbo/gpt-4),接收角色消息,主流推荐。
  2. OpenAI(旧版):面向文本补全模型(text-davinci 等),现已逐步淘汰。

总结

  1. ChatOpenAI 是 LangChain 对接 OpenAI 对话模型的标准入口,0.1+ 版本统一从 langchain-openai 导入。
  2. 核心三要素:model + api_key + 提示词。
  3. 调用场景选型:
    • 简单问答 → invoke
    • 聊天界面 → stream 流式
    • 批量任务 → batch
    • 后端服务/高并发 → 异步 ainvoke
  4. 工程化务必搭配 Prompt模板 + 对话记忆 实现多轮对话。