【LangChain】langchain_openai.ChatOpenAI 类:基于 OpenAI 的聊天完成 API(Chat Completions API)
langchain_openai.ChatOpenAI 是 LangChain 中用于调用 OpenAI 对话模型(如 gpt-3.5-turbo、gpt-4)的类,基于 OpenAI 的聊天完成 API(Chat Completions API)。它继承自 BaseChatModel,支持结构化的消息输入(如 SystemMessage、HumanMessage),适合对话、问答和复杂任务。初始
langchain_openai.ChatOpenAI 类是 LangChain 中用于与 OpenAI 对话模型(chat models)交互的类,继承自 langchain_core.language_models.chat_models.BaseChatModel,而非直接继承 BaseLLM。
本文基于 LangChain 0.3.x ,详细介绍 ChatOpenAI 的定义、初始化、常用方法和属性,并提供一个独立示例,展示如何使用 ChatOpenAI 调用 gpt-3.5-turbo 模型处理人工智能主题的对话,示例结合 ChatPromptTemplate 和 invoke 方法。
langchain_openai.ChatOpenAI 简介
langchain_openai.ChatOpenAI 是 LangChain 中用于调用 OpenAI 对话模型(如 gpt-3.5-turbo、gpt-4)的类,基于 OpenAI 的聊天完成 API(Chat Completions API)。它继承自 BaseChatModel,支持结构化的消息输入(如 SystemMessage、HumanMessage),适合对话、问答和复杂任务。
核心功能:
- 调用 OpenAI 聊天完成 API,生成对话响应。
- 支持同步(
invoke、generate)、异步(ainvoke、agenerate)和流式(stream、astream)生成。 - 处理结构化消息,支持系统提示、用户输入和对话历史。
- 配置 OpenAI 特定的参数(如
temperature、max_tokens)。 - 集成到 LCEL 链,适合 RAG、对话系统或多轮交互。
适用场景:
- 构建基于 OpenAI 的对话或问答系统。
- 处理多轮对话,维护上下文。
- 集成到生产级应用,利用 OpenAI 的高性能对话模型。
- 开发需要结构化输入的 LLM 应用(如客服、助手)。
与 langchain_openai.OpenAI 对比:
OpenAI:用于完成模型(如gpt-3.5-turbo-instruct),处理原始文本提示,返回文本。ChatOpenAI:用于对话模型(如gpt-3.5-turbo、gpt-4),支持结构化消息(SystemMessage、HumanMessage),更适合对话场景。
类定义和初始化
以下是 langchain_openai.ChatOpenAI 的定义,基于 LangChain 源码(langchain_openai/chat_models/base.py)和官方文档(ChatOpenAI)。
类签名
class ChatOpenAI(BaseChatModel):
def __init__(
self,
*,
model: str = "gpt-3.5-turbo",
temperature: float = 0.7,
max_tokens: Optional[int] = None,
timeout: Optional[float] = None,
max_retries: int = 2,
api_key: Optional[str] = None,
organization: Optional[str] = None,
base_url: Optional[str] = None,
default_headers: Optional[Dict[str, str]] = None,
default_query: Optional[Dict[str, Any]] = None,
http_client: Optional[Any] = None,
model_kwargs: Optional[Dict[str, Any]] = None,
n: int = 1,
stop: Optional[List[str]] = None,
presence_penalty: Optional[float] = None,
frequency_penalty: Optional[float] = None,
top_p: Optional[float] = None,
logprobs: Optional[bool] = None,
top_logprobs: Optional[int] = None,
**kwargs: Any
) -> None
- 关键参数:
model(str,默认"gpt-3.5-turbo"):OpenAI 对话模型名称。temperature(float,默认0.7):控制生成随机性(0~2)。max_tokens(Optional[int],默认None):最大输出 token 数。timeout(Optional[float],默认None):请求超时(秒)。max_retries(int,默认2):请求失败重试次数。api_key(Optional[str],默认None):OpenAI API 密钥(可通过环境变量OPENAI_API_KEY设置)。organization(Optional[str],默认None):OpenAI 组织 ID。base_url(Optional[str],默认None):自定义 API 地址(默认https://api.openai.com/v1)。n(int,默认1):每提示生成的结果数。stop(Optional[List[str]],默认None):停止词列表。presence_penalty(Optional[float],默认None):鼓励新词出现。frequency_penalty(Optional[float],默认None):降低重复词频率。top_p(Optional[float],默认None):核采样概率。logprobs(Optional[bool],默认None):是否返回对数概率。top_logprobs(Optional[int],默认None):返回前 N 个 token 的对数概率。model_kwargs(Optional[Dict[str, Any]],默认None):其他 OpenAI API 参数。
初始化示例
from langchain_openai import ChatOpenAI
import os
os.environ["OPENAI_API_KEY"] = "your-api-key"
llm = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0.7,
max_tokens=512,
api_key=os.environ["OPENAI_API_KEY"]
)
支持的模型(部分,需确认 OpenAI API 可用性):
gpt-3.5-turbogpt-3.5-turbo-0125gpt-4gpt-4-turbogpt-4ogpt-4o-mini- 更多见 OpenAI API 文档.
常用方法
ChatOpenAI 继承自 BaseChatModel,支持对话模型的特定接口。以下是常用的方法,基于使用频率和 ChatOpenAI 特性。
1. invoke
def invoke(self, input: LanguageModelInput, config: Optional[RunnableConfig] = None, *, stop: Optional[List[str]] = None, **kwargs: Any) -> AIMessage
- 功能:同步调用,处理消息列表,返回
AIMessage。 - 输入:
LanguageModelInput(通常是List[BaseMessage],如[SystemMessage, HumanMessage])。 - 使用场景:单次对话、问答。
- 示例:
from langchain_core.messages import HumanMessage response = llm.invoke([HumanMessage(content="什么是人工智能?")]) print(response.content)
2. generate
def generate(self, messages: List[List[BaseMessage]], stop: Optional[List[str]] = None, callbacks: Optional[Callbacks] = None, **kwargs: Any) -> LLMResult
- 功能:同步批量生成,返回
LLMResult(包含generations和llm_output)。 - 输入:
List[List[BaseMessage]],每个子列表是一组对话消息。 - 使用场景:批量对话、需要 token 使用量。
- 示例:
messages = [ [HumanMessage(content="什么是人工智能?")], [HumanMessage(content="AI 有哪些应用?")] ] result = llm.generate(messages) for generations in result.generations: print(generations[0].text) print(result.llm_output) # {'token_usage': ...}
3. stream
def stream(self, input: LanguageModelInput, config: Optional[RunnableConfig] = None, *, stop: Optional[List[str]] = None, **kwargs: Any) -> Iterator[AIMessageChunk]
- 功能:同步流式生成,逐块返回
AIMessageChunk。 - 使用场景:实时聊天界面。
- 示例:
for chunk in llm.stream([HumanMessage(content="人工智能有哪些应用?")]): print(chunk.content, end="", flush=True)
4. ainvoke
async def ainvoke(self, input: LanguageModelInput, config: Optional[RunnableConfig] = None, *, stop: Optional[List[str]] = None, **kwargs: Any) -> AIMessage
- 功能:异步单次生成。
- 使用场景:高并发 Web 服务。
- 示例:
import asyncio async def run(): response = await llm.ainvoke([HumanMessage(content="什么是人工智能?")]) print(response.content) asyncio.run(run())
5. agenerate
async def agenerate(self, messages: List[List[BaseMessage]], stop: Optional[List[str]] = None, callbacks: Optional[Callbacks] = None, **kwargs: Any) -> LLMResult
- 功能:异步批量生成。
- 使用场景:异步批量对话。
- 示例:
async def run(): result = await llm.agenerate(messages) for generations in result.generations: print(generations[0].text) asyncio.run(run())
6. astream
async def astream(self, input: LanguageModelInput, config: Optional[RunnableConfig] = None, *, stop: Optional[List[str]] = None, **kwargs: Any) -> AsyncIterator[AIMessageChunk]
- 功能:异步流式生成。
- 使用场景:WebSocket 聊天。
- 示例:
async def run(): async for chunk in llm.astream([HumanMessage(content="人工智能有哪些应用?")]): print(chunk.content, end="", flush=True) asyncio.run(run())
ChatOpenAI 特有特性:
- 支持结构化消息输入:
from langchain_core.messages import SystemMessage, HumanMessage messages = [ SystemMessage(content="你是 AI 专家"), HumanMessage(content="什么是人工智能?") ] - 返回
AIMessage或AIMessageChunk,包含content和元数据:print(response.additional_kwargs) # {'finish_reason': 'stop', ...} - 支持 token 使用量统计:
print(result.llm_output["token_usage"])
常用属性
以下是 ChatOpenAI 类的常用属性,基于源码和文档。
1. model
- 类型:
str - 功能:指定 OpenAI 对话模型名称。
- 示例:
print(llm.model) # gpt-3.5-turbo
2. temperature
- 类型:
float - 功能:控制生成随机性(0~2)。
- 示例:
llm.temperature = 0.5
3. max_tokens
- 类型:
Optional[int] - 功能:最大输出 token 数。
- 示例:
llm.max_tokens = 1024
4. api_key
- 类型:
Optional[str] - 功能:OpenAI API 密钥。
- 示例:
llm.api_key = "new-api-key"
5. cache
- 类型:
Optional[BaseCache] - 功能:缓存生成结果。
- 示例:
from langchain_core.caches import InMemoryCache llm.cache = InMemoryCache()
6. callbacks
- 类型:
Optional[Callbacks] - 功能:默认回调函数。
- 示例:
from langchain_core.callbacks import StdOutCallbackHandler llm.callbacks = [StdOutCallbackHandler()]
使用 langchain_openai.ChatOpenAI 的对话示例
以下是一个独立示例,展示如何使用 langchain_openai.ChatOpenAI 调用 gpt-3.5-turbo 模型处理人工智能主题的对话,结合 ChatPromptTemplate 和 invoke 方法,启用缓存和回调,支持系统消息和用户问题。
准备环境:
- 获取 OpenAI API 密钥:OpenAI Platform。
- 设置环境变量:
export OPENAI_API_KEY="your-api-key" - 安装依赖:
pip install --upgrade langchain langchain-openai
代码:
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_core.caches import InMemoryCache
from langchain_core.callbacks import StdOutCallbackHandler
import os
# 设置 API 密钥
os.environ["OPENAI_API_KEY"] = "your-api-key"
# 初始化 ChatOpenAI
llm = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0.7,
max_tokens=512,
cache=InMemoryCache(), # 启用缓存
callbacks=[StdOutCallbackHandler()] # 默认回调
)
# 定义 ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个人工智能专家,回答以下问题。"),
("human", "{question}")
])
# 创建问答链
qa_chain = (
{"question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 使用 invoke 方法
print("invoke 方法:")
question = "什么是人工智能?"
try:
response = llm.invoke(
prompt.format_prompt(question=question).to_messages(),
config={
"max_tokens": 512,
"tags": ["ai_question"]
}
)
print(f"问题: {question}")
print(f"回答: {response.content}")
except Exception as e:
print(f"错误: {e}")
# 使用链调用 invoke
print("\n链式 invoke:")
response = qa_chain.invoke(question)
print(f"问题: {question}")
print(f"回答: {response}")
# 查看属性
print("\n模型属性:")
print(f"模型: {llm.model}")
print(f"温度: {llm.temperature}")
print(f"缓存状态: {llm.cache is not None}")
输出示例(实际输出取决于模型和 API 响应):
invoke 方法:
[StdOutCallbackHandler] 开始生成...
[StdOutCallbackHandler] 生成结束
问题: 什么是人工智能?
回答: 人工智能(AI)是计算机科学的一个分支,旨在创建能够执行需要人类智能的任务的系统,例如学习、推理、问题解决和决策。
链式 invoke:
问题: 什么是人工智能?
回答: 人工智能(AI)是计算机科学的一个分支,旨在创建能够执行需要人类智能的任务的系统,例如学习、推理、问题解决和决策。
模型属性:
模型: gpt-3.5-turbo
温度: 0.7
缓存状态: True
代码说明
- LLM 初始化:
- 使用
ChatOpenAI调用gpt-3.5-turbo,配置temperature=0.7、max_tokens=512。 - 启用
InMemoryCache和StdOutCallbackHandler。
- 使用
- 提示模板:
ChatPromptTemplate定义系统消息和用户问题。
- 问答链:
- LCEL 链组合
prompt、llm和StrOutputParser,简化调用。
- LCEL 链组合
- invoke 使用:
- 直接调用
llm.invoke,使用格式化的消息列表。 - 通过
qa_chain.invoke调用链,展示集成方式。
- 直接调用
- 属性展示:
- 打印
model、temperature和cache状态。
- 打印
- 错误处理:
- 使用
try-except捕获 API 错误。
- 使用
运行要求:
- 有效的 OpenAI API 密钥:
export OPENAI_API_KEY="your-api-key" - 安装依赖:
pip install --upgrade langchain langchain-openai - 网络连接:访问
https://api.openai.com。
注意事项
- API 密钥:
- 确保
OPENAI_API_KEY已设置:echo $OPENAI_API_KEY - 或在代码中显式设置:
llm = ChatOpenAI(api_key="your-api-key")
- 确保
- 模型可用性:
- 确认模型支持聊天完成 API(
gpt-3.5-turbo而非gpt-3.5-turbo-instruct):print(llm.model) - 检查 OpenAI 文档:Models.
- 确认模型支持聊天完成 API(
- 消息格式:
- 使用
SystemMessage和HumanMessage:from langchain_core.messages import SystemMessage, HumanMessage messages = [SystemMessage(content="系统提示"), HumanMessage(content="用户问题")] - 或使用
ChatPromptTemplate简化:prompt = ChatPromptTemplate.from_messages([("system", "提示"), ("human", "{question}")])
- 使用
- 参数配置:
stop:控制输出终止:response = llm.invoke(messages, stop=["\n"])n:生成多条结果:result = llm.generate([messages], n=3) print([g.text for g in result.generations[0]])- 回调:使用
StdOutCallbackHandler记录过程:response = llm.invoke(messages, config={"callbacks": [StdOutCallbackHandler()]})
- 性能优化:
- 缓存:启用
InMemoryCache优化重复查询:llm.cache = InMemoryCache() - 批量处理:使用
generate处理多组消息:result = llm.generate([messages1, messages2]) - 超时和重试:调整
timeout和max_retries:llm = ChatOpenAI(timeout=10, max_retries=3)
- 缓存:启用
- 错误调试:
- API 密钥无效:
- 检查密钥:
print(os.environ.get("OPENAI_API_KEY")) - 重新生成密钥:OpenAI Platform.
- 检查密钥:
- 模型不可用:
- 确认模型名称:
llm = ChatOpenAI(model="gpt-3.5-turbo")
- 确认模型名称:
- 网络错误:
- 检查连接:
curl https://api.openai.com - 增加超时:
llm = ChatOpenAI(timeout=30)
- 检查连接:
- 输出为空:
- 检查消息:
print(messages) - 增加
max_tokens:response = llm.invoke(messages, max_tokens=1024)
- 检查消息:
- API 密钥无效:
常见问题
Q1:如何选择 ChatOpenAI 和 OpenAI?
A:
ChatOpenAI:适合对话模型(如gpt-3.5-turbo),支持结构化消息。OpenAI:适合完成模型(如gpt-3.5-turbo-instruct),处理原始文本。
from langchain_openai import OpenAI
llm = OpenAI(model="gpt-3.5-turbo-instruct")
Q2:如何启用流式生成?
A:使用 stream 或 astream:
for chunk in llm.stream(messages):
print(chunk.content, end="")
# 异步
async for chunk in llm.astream(messages):
print(chunk.content, end="")
Q3:如何查看 token 使用量?
A:使用 generate 获取 llm_output:
result = llm.generate([messages])
print(result.llm_output["token_usage"])
Q4:如何在 FastAPI 中使用?
A:异步调用 ainvoke 或 astream:
from fastapi import FastAPI
from langchain_core.messages import HumanMessage
app = FastAPI()
@app.post("/chat")
async def chat(prompt: str):
response = await llm.ainvoke([HumanMessage(content=prompt)])
return {"result": response.content}
总结
langchain_openai.ChatOpenAI 是 LangChain 中调用 OpenAI 对话模型的核心类,核心功能包括:
- 定义:继承
BaseChatModel,支持 OpenAI 聊天完成 API。 - 初始化:配置
model、api_key、temperature等。 - 常用方法:
invoke(单次)、generate(批量)、stream(流式)等。 - 常用属性:
model、temperature、cache等。
更多推荐

所有评论(0)