在使用 LangChain 框架进行大模型开发时,经常会遇到三个看似相似但用途不同的类:OpenAI、ChatOpenAI 和 OpenAIEmbeddings。它们虽然都依赖于 OpenAI 提供的 API 服务,但在功能定位、使用场景和输出形式上有显著差异。
本文将详细解析这三者的区别,并通过代码示例帮助你正确选择合适的组件。
📚 目录
- 概述
OpenAI:文本生成模型(Completion 模型)ChatOpenAI:对话优化模型(Chat 模型)OpenAIEmbeddings:文本向量化工具- 核心区别对比表
- 如何选择?
- 代码示例汇总
- 总结
概述
| 类名 | 功能 | 对应 OpenAI 模型类型 |
|---|---|---|
OpenAI | 调用传统的文本补全模型(如 text-davinci-003) | Completion 模型 |
ChatOpenAI | 调用基于对话的模型(如 gpt-3.5-turbo, gpt-4) | Chat Completions 模型 |
OpenAIEmbeddings | 生成文本的嵌入向量(embedding),用于语义搜索等任务 | Embedding 模型(如 text-embedding-ada-002) |
✅ 注意:这三个类都属于
langchain-openai包(旧版本中为langchain内置),需安装并配置 OpenAI API Key。
pip install langchain-openai
OpenAI:文本生成模型(Completion 模型)
功能说明
OpenAI 类封装了 OpenAI 的 Completion API,适用于传统的文本补全任务,比如续写句子、生成文章段落等。
这类模型输入是一段文本提示(prompt),输出是模型根据上下文“继续写下去”的内容。
典型模型
text-davinci-003text-curie-001(已逐步淘汰)
⚠️ 注意:该接口不支持多轮对话结构(system/user/assistant 角色划分),也不推荐用于新项目。
使用场景
- 简单文本生成
- Prompt-based 单次补全任务
- 非对话式 NLP 任务
示例代码
from langchain_openai import OpenAI
llm = OpenAI(model="text-davinci-003", temperature=0.7)
response = llm.invoke("请写一首关于春天的诗。")
print(response)
ChatOpenAI:对话优化模型(Chat 模型)
功能说明
ChatOpenAI 封装了 OpenAI 的 Chat Completions API,专为多轮对话设计,支持 system、user、assistant 等角色消息格式。
它底层使用的是 GPT-3.5 或 GPT-4 系列的聊天优化模型(如 gpt-3.5-turbo),性能更好、成本更低,是当前主流选择。
典型模型
gpt-3.5-turbogpt-4gpt-4-turbo
使用场景
- 多轮对话机器人
- Agent 系统
- 需要角色控制的任务(如让模型扮演专家)
- 结构化提示工程(few-shot, CoT 等)
示例代码
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
chat = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.8)
messages = [
SystemMessage(content="你是一个乐于助人的中文助手。"),
HumanMessage(content="请解释什么是机器学习?")
]
response = chat.invoke(messages)
print(response.content)
OpenAIEmbeddings:文本向量化工具
功能说明
OpenAIEmbeddings 用于调用 OpenAI 的 Embeddings API,将文本转换为高维向量(embedding vector),这些向量可用于计算语义相似度、构建向量数据库等。
每个文本被映射为一个固定长度的浮点数数组(如 1536 维)。
典型模型
text-embedding-ada-002
✅ 当前唯一推荐使用的 OpenAI embedding 模型。
使用场景
- 向量检索(RAG 架构中的关键一步)
- 文本聚类
- 语义去重
- 相似性匹配
示例代码
from langchain_openai import OpenAIEmbeddings
embedder = OpenAIEmbeddings(model="text-embedding-ada-002")
texts = ["人工智能", "机器学习", "苹果是一种水果"]
embeddings = embedder.embed_documents(texts)
# 输出第一个文本的嵌入向量(前10个维度示例)
print(embeddings[0][:10])
💡 提示:返回的是列表的列表,每个子列表是一个文本的 embedding 向量。
核心区别对比表
| 特性 | OpenAI | ChatOpenAI | OpenAIEmbeddings |
|---|---|---|---|
| 所属 API | Completion API | Chat Completions API | Embeddings API |
| 主要用途 | 文本生成(补全) | 对话式交互 | 文本向量化 |
| 支持角色消息 | ❌ 不支持 | ✅ 支持 system/user/assistant | ❌ 不适用 |
| 输出类型 | 字符串文本 | AIMessage 对象(含 content) | 浮点数向量(list[float]) |
| 推荐程度 | ❌ 已过时,不推荐新项目使用 | ✅ 强烈推荐用于对话任务 | ✅ 必须用于 RAG、检索等任务 |
| 常用模型 | text-davinci-003 | gpt-3.5-turbo, gpt-4 | text-embedding-ada-002 |
| 是否计费 | 是(按 token) | 是(按 input/output token) | 是(按输入 token) |
如何选择?
| 你的需求 | 应该使用 |
|---|---|
| 我想让 AI 回答问题、做推理、写文案 | ✅ ChatOpenAI |
| 我需要构建一个多轮对话机器人 | ✅ ChatOpenAI |
| 我要做知识库问答(RAG) | ✅ ChatOpenAI(回答)+ OpenAIEmbeddings(编码文档) |
| 我要把文本变成向量,做相似度计算 | ✅ OpenAIEmbeddings |
我在维护老项目用了 text-davinci-003 | ⚠️ 可用 OpenAI,但建议迁移到 gpt-3.5-turbo |
| 我要做语义搜索或向量数据库 | ✅ OpenAIEmbeddings + 向量库(如 FAISS、Pinecone) |
代码示例汇总
完整整合示例:RAG 基础流程
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
# 1. 初始化组件
embedder = OpenAIEmbeddings(model="text-embedding-ada-002")
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
# 2. 创建向量数据库(简单示例)
texts = ["中国的首都是北京", "法国的首都是巴黎"]
db = FAISS.from_texts(texts, embedder)
retriever = db.as_retriever()
# 3. 构建 RAG 链
prompt = ChatPromptTemplate.from_template("""
你是一个问答助手,请根据以下上下文回答问题:
{context}
问题:{question}
""")
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 4. 查询
result = rag_chain.invoke("中国的首都是哪里?")
print(result)
总结
| 类 | 关键词 | 推荐指数 |
|---|---|---|
OpenAI | “旧版补全” | ⭐☆☆☆☆(不推荐) |
ChatOpenAI | “对话、智能、主流” | ⭐⭐⭐⭐⭐ |
OpenAIEmbeddings | “向量、语义、RAG” | ⭐⭐⭐⭐⭐ |
📌 最佳实践建议:
- 新项目一律优先使用
ChatOpenAI替代OpenAI - 凡涉及语义理解、检索、向量操作,必须使用
OpenAIEmbeddings - 合理组合两者可实现强大的 RAG、Agent 等高级应用
📌 扩展阅读
如有更多 LangChain 使用问题,欢迎继续提问!