介绍
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 类区别
ChatOpenAI:面向对话模型(gpt-3.5-turbo/gpt-4),接收角色消息,主流推荐。OpenAI(旧版):面向文本补全模型(text-davinci 等),现已逐步淘汰。
总结
ChatOpenAI是 LangChain 对接 OpenAI 对话模型的标准入口,0.1+ 版本统一从langchain-openai导入。- 核心三要素:
model+api_key+ 提示词。 - 调用场景选型:
- 简单问答 →
invoke - 聊天界面 →
stream流式 - 批量任务 →
batch - 后端服务/高并发 → 异步
ainvoke
- 简单问答 →
- 工程化务必搭配 Prompt模板 + 对话记忆 实现多轮对话。