LangChain 中 OpenAI、ChatOpenAI 和 OpenAIEmbeddings`的区别详解

3 阅读5分钟

在使用 LangChain 框架进行大模型开发时,经常会遇到三个看似相似但用途不同的类:OpenAIChatOpenAIOpenAIEmbeddings。它们虽然都依赖于 OpenAI 提供的 API 服务,但在功能定位、使用场景和输出形式上有显著差异。

本文将详细解析这三者的区别,并通过代码示例帮助你正确选择合适的组件。


📚 目录

  1. 概述
  2. OpenAI:文本生成模型(Completion 模型)
  3. ChatOpenAI:对话优化模型(Chat 模型)
  4. OpenAIEmbeddings:文本向量化工具
  5. 核心区别对比表
  6. 如何选择?
  7. 代码示例汇总
  8. 总结

概述

类名功能对应 OpenAI 模型类型
OpenAI调用传统的文本补全模型(如 text-davinci-003Completion 模型
ChatOpenAI调用基于对话的模型(如 gpt-3.5-turbo, gpt-4Chat 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-003
  • text-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,专为多轮对话设计,支持 systemuserassistant 等角色消息格式。

它底层使用的是 GPT-3.5 或 GPT-4 系列的聊天优化模型(如 gpt-3.5-turbo),性能更好、成本更低,是当前主流选择。

典型模型

  • gpt-3.5-turbo
  • gpt-4
  • gpt-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 向量。


核心区别对比表

特性OpenAIChatOpenAIOpenAIEmbeddings
所属 APICompletion APIChat Completions APIEmbeddings API
主要用途文本生成(补全)对话式交互文本向量化
支持角色消息❌ 不支持✅ 支持 system/user/assistant❌ 不适用
输出类型字符串文本AIMessage 对象(含 content)浮点数向量(list[float])
推荐程度❌ 已过时,不推荐新项目使用✅ 强烈推荐用于对话任务✅ 必须用于 RAG、检索等任务
常用模型text-davinci-003gpt-3.5-turbo, gpt-4text-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 使用问题,欢迎继续提问!