LangChain教程:ChatOpenAI详解 作者:马育民 • 2026-05-30 09:07 • 阅读:10000 # 介绍 `ChatOpenAI` 是 LangChain 对接 **OpenAI 对话模型(gpt-3.5-turbo、gpt-4、gpt-4o 等)** 的核心聊天模型类,专门处理**对话式交互**,区别于老版 `OpenAI`(文本补全模型)。 # 基础用法 ### 1. 基础调用(单轮对话) ```python 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`: ```python 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,越高越避免重复语句 | ### 完整初始化示例 ```python 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` 同步单次调用(最常用) 阻塞等待完整结果返回,适合常规业务: ```python res = llm.invoke("你好") # 返回值是 AIMessage 对象 print(type(res)) print("回答:", res.content) # 额外元数据(token消耗、模型名等) print("元数据:", res.response_metadata) ``` ### 2. `batch` 批量调用 一次性传入多个问题,批量获取结果,**效率更高**: ```python queries = ["1+1等于几", "介绍Python", "什么是大模型"] results = llm.batch(queries) for idx, res in enumerate(results): print(f"问题{idx+1}:{res.content}") ``` ### 3. `stream` 流式输出(打字机效果) 对话/聊天场景首选,需开启 `streaming=True`: ```python 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` 高并发场景(接口服务、后端)使用,不阻塞事件循环: ```python 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` 动态构造对话: ```python 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` + 记忆组件: ```python 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` **已废弃** ✅ 新版正确导入: ```python 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模板 + 对话记忆** 实现多轮对话。 原文出处:http://malaoshi.top/show_1GW3P6rsHnDv.html