本文介绍Langchain如何接入chat模型和embedding模型。
一、如何接入Chat模型?
1、使用ChatOpenAI接入
(1)如何接入
① 首先你得先安装库
bash
pip install langchain-openai
② 使用invoke方法来调用chat model
python
# 从 langchain_openai 模块导入 ChatOpenAI 类
# 这是 LangChain 官方提供的、用于调用 OpenAI 兼容接口
from langchain_openai import ChatOpenAI
# 从 dotenv 模块导入 load_dotenv 函数,用于加载 .env 文件中的环境变量
from dotenv import load_dotenv
# 导入 os 模块,用于读取操作系统环境变量
import os
# 加载当前目录下的 .env 文件中的环境变量
# override=True 表示如果环境中已存在同名变量,则用 .env 中的值覆盖它
# 这样可以确保 OPENAI_API_KEY 和 OPENAI_BASE_URL 被正确设置
load_dotenv(override=True)
# 创建一个 ChatOpenAI 模型实例
model = ChatOpenAI(
model="gpt-4.1-nano", # 指定要使用的模型名称
base_url=os.getenv("OPENAI_BASE_URL"), # 指定 API 请求的基地址
# 若使用官方 OpenAI,通常可省略此参数;若使用代理或国产平台(如阿里、智谱的 OpenAI 兼容接口),则必须指定
api_key=os.getenv("OPENAI_API_KEY") # 从环境变量中读取 API 密钥,用于身份认证
# 安全提示:切勿将 API Key 写死在代码中,应始终通过环境变量管理
)
# 调用模型进行单轮对话推理(同步调用)
# 输入是一个字符串 "你好",LangChain 会自动将其包装为 HumanMessage
# 返回一个 AIMessage 对象,包含模型生成的回复内容及元数据
resp1 = model.invoke("你好")
# 注意:此时 resp1 是一个 AIMessage 实例
print(resp1.content) # 打印 AI 回复的纯文本
print(resp1.response_metadata) # 查看 token 使用、完成原因等元信息
③ 使用stream来流式输出
python
# 流式输出
for chunk in model.stream("你好,给我写一篇500字的关于冬天的散文。"):
print(chunk.text, end="")
(2)参数介绍
python
model = ChatOpenAI(
model="gpt-4.1-nano", # 指定在线大模型的名字
base_url=os.getenv("OPENAI_BASE_URL"), # 在线大模型的API服务提供商所指定的访问地址
api_key=os.getenv("OPENAI_API_KEY"), # API密钥
temperature=0.8, # 采样温度
max_tokens=256, # 最大回复token数量
timeout=30, # 最大请求超时等待时间
max_retries=2 # 如果超时或请求失败了最大重试次数
)
resp2 = model.invoke("给我写一篇关于家乡的散文,要求字数500字")
(3)模型返回的AIMessage长什么样子?
在 LangChain 中,AIMessage 是表示由语言模型生成的响应消息的核心类之一,属于 langchain_core.messages 模块。它是 BaseMessage 的子类,专门用于封装 AI 的输出内容。核心字段说明:
| 字段名 | 类型 | 说明 |
|---|---|---|
content |
str 或 List[Union[str, dict]] |
AI 生成的主要文本内容。对于多模态模型,可能是包含文本和媒体信息的列表。 |
additional_kwargs |
dict |
额外的任意关键字参数,通常用于传递模型特定的元数据(如拒绝理由 refusal)。 |
response_metadata |
dict |
包含与本次响应相关的详细元数据,例如 token 使用情况、模型名称、完成原因等。 |
id |
Optional[str] |
消息的唯一标识符(可选),可用于追踪或调试。 |
name |
Optional[str] |
可选名称,用于在多智能体对话中标记发言者(在 AIMessage 中较少使用)。 |
usage_metadata |
Optional[dict] |
结构化的 token 使用统计信息(输入/输出 tokens 等),是 response_metadata 中 token 信息的简化版。 |
python
AIMessage(
content='我的家乡,位于江南水乡的心脏地带,是一片被江水环绕、充满诗意的土地。这里山清水秀,四季如画,每一处角落都藏着属于它的故事与温暖。每当我闭上眼睛,脑海中便浮现出那熟悉的景色,心中涌动着浓浓的乡愁。\n\n春天的家乡,万物复苏。嫩绿的柳枝在微风中轻轻摇曳,河畔的桃花如云似霞,飘散着淡淡的香气。田野里,油菜花金灿灿一片,蜜蜂忙碌,蝴蝶翩翩,为大地增添了无限生机。村庄的小路边,孩子们在嬉戏追逐,笑声在空气中回荡。春天,是希望的季节,也是我心中最温暖的时光。\n\n夏日的家乡,绿意盎然。河水清澈见底,倒映着蓝天白云。人们喜欢在河边纳凉,划',
additional_kwargs={'refusal': None},
response_metadata={
'token_usage': {
'completion_tokens': 256,
'prompt_tokens': 24,
'total_tokens': 280,
'completion_tokens_details': {
'accepted_prediction_tokens': 0,
'audio_tokens': 0,
'reasoning_tokens': 0,
'rejected_prediction_tokens': 0
},
'prompt_tokens_details': {
'audio_tokens': 0,
'cached_tokens': 0
}
},
'model_provider': 'openai',
'model_name': 'gpt-4.1-nano-2025-04-14',
'system_fingerprint': 'fp_7f8eb7d1f9',
'id': 'chatcmpl-ConOLfngFphclu2S4GwHcjKCBjRAB',
'service_tier': 'default',
'finish_reason': 'length',
'logprobs': None
},
id='lc_run--019b3b0d-79ea-7701-978b-3ba0843e8aa6-0',
usage_metadata={
'input_tokens': 24,
'output_tokens': 256,
'total_tokens': 280,
'input_token_details': {
'audio': 0,
'cache_read': 0
},
'output_token_details': {
'audio': 0,
'reasoning': 0
}
}
)
python
# 美化输出
resp2.pretty_print()
===================== Ai Message ================
我的家乡,位于江南水乡的心脏地带,是一片被江水环绕、充满诗意的土地。这里山清水秀,四季如画,每一处角落都藏着属于它的故事与温暖。每当我闭上眼睛,脑海中便浮现出那熟悉的景色,心中涌动着浓浓的乡愁。 春天的家乡,万物复苏。嫩绿的柳枝在微风中轻轻摇曳,河畔的桃花如云似霞,飘散着淡淡的香气。田野里,油菜花金灿灿一片,蜜蜂忙碌,蝴蝶翩翩,为大地增添了无限生机。村庄的小路边,孩子们在嬉戏追逐,笑声在空气中回荡。春天,是希望的季节,也是我心中最温暖的时光。 夏日的家乡,绿意盎然。河水清澈见底,倒映着蓝天白云。人们喜欢在河边纳凉,划
2、使用Langchain为各个模型供应商开发的Chat模型类来接入
(1)ChatZhipuAI
ZHIPU AI - Docs by LangChain
https://docs.langchain.com/oss/python/integrations/chat/zhipuai① 首先得安装必要的包
bash
pip install langchain-community
pip install -U httpx httpx-sse PyJWT
② 使用方法
python
# 导入 LangChain 中用于调用智谱 AI(ZhipuAI)聊天模型的封装类
from langchain_community.chat_models import ChatZhipuAI
# 导入 dotenv 模块,用于从 .env 文件加载环境变量(如 API 密钥)
# 注意:原代码中未显式导入,这里补充完整以确保可运行
from dotenv import load_dotenv
import os # 可选,但推荐用于环境变量操作
# 从当前目录下的 .env 文件中加载环境变量,并覆盖已存在的同名环境变量
# 这样做可以确保 ZHIPUAI_API_KEY 被正确读取(LangChain 会自动读取该变量名)
load_dotenv(override=True)
# 初始化智谱 AI 的聊天模型实例
# 指定使用 "glm-4.5-flash" 模型(这是智谱推出的高性能、低延迟的轻量级大模型)
model = ChatZhipuAI(
model="glm-4.5-flash" # 指定模型名称
# 注意:API Key 无需手动传入,LangChain 会自动从环境变量 ZHIPUAI_API_KEY 中读取
)
# 构建对话消息列表,采用 (role, content) 元组格式
# LangChain 会自动将其转换为内部 Message 对象(如 SystemMessage、HumanMessage)
messages = [
# 系统消息:设定 AI 的角色和行为规范
("system", "你是一个翻译官,擅长英汉互译,输出原文以及对照的译文。"),
# 用户消息:提供待翻译的中文诗句
("user", "春眠不觉晓。")
]
# 调用模型进行推理(同步调用),传入消息列表,返回一个 AIMessage 对象
resp3 = model.invoke(messages)
# 打印模型生成的回复内容(仅文本部分,不含元数据)
# resp3 是 AIMessage 类型,其 .content 属性包含 AI 生成的字符串
print(resp3.content)
(2)ChatOllama
ChatOllama - Docs by LangChain
https://docs.langchain.com/oss/python/integrations/chat/ollama① 一样的要安装必要的包
bash
pip install langchain-ollama
② 使用说明
前提条件:
- 你的系统必须已安装并运行 Ollama(默认监听
http://localhost:11434)。 - 必须已拉取指定模型
python
from langchain_ollama import ChatOllama
model = ChatOllama(
model="qwen3:4b"
)
resp4 = model.invoke("你好")
二、如何接入Embedding模型?
1、使用OpenAIEmbeddings接入
(1)如何接入嵌入模型
python
# 从 langchain_openai 模块导入 OpenAIEmbeddings 类
# 尽管名字含 "OpenAI",但它实际上支持任何兼容 OpenAI Embedding API 协议的服务
from langchain_openai import OpenAIEmbeddings
# 导入 dotenv 的 load_dotenv 函数,用于从 .env 文件加载环境变量
from dotenv import load_dotenv
# 导入 os 模块,用于读取操作系统环境变量
import os
# 加载 .env 文件中的环境变量,并覆盖系统中已存在的同名变量
# 这样可以安全地管理敏感信息(如 API Key),避免硬编码在代码中
load_dotenv(override=True)
# 创建一个文本嵌入(embedding)模型实例
# 该实例可用于将文本转换为高维向量(常用于语义搜索、RAG、聚类等任务)
embeddings = OpenAIEmbeddings(
model="BAAI/bge-m3", # 指定要使用的嵌入模型名称
# BGE-M3 是由北京智源研究院(BAAI)开发的多语言、多功能嵌入模型
# 支持稠密向量(dense)、稀疏向量(sparse)和多向量(multi-vector)检索
# 注意:此处模型名需与服务提供商(如硅基流动)支持的名称一致
base_url=os.getenv("SILICONFLOW_BASE_URL"), # 指定 Embedding API 的服务地址
# 硅基流动(SiliconFlow)提供了兼容 OpenAI API 的接口
# 其 base_url 通常形如:https://api.siliconflow.cn/v1
# 若使用官方 OpenAI,则无需此参数;但此处调用的是第三方服务,必须指定
api_key=os.getenv("SILICONFLOW_API_KEY") # 从环境变量中读取硅基流动平台的 API 密钥
# 用于身份认证,确保有权限调用其 Embedding 服务
# 安全提示:切勿将 API Key 写死在代码中!
)
(2)如何使用嵌入模型
python
# ========================
# 1. 准备原始文档数据
# ========================
# 定义一个包含多个简短文本的文档列表,用于后续向量化和检索
documents = [
"俄罗斯和乌克兰冲突", # 文档 0:涉及俄乌战争
"巴勒斯坦和以色列打仗", # 文档 1:涉及巴以冲突
"中国全面建成小康社会" # 文档 2:关于中国社会发展成就
]
# ========================
# 2. 使用嵌入模型对文档进行向量化
# ========================
# 调用 embeddings.embed_documents() 方法,将整个文档列表批量转换为向量列表
# 每个文档对应一个高维向量(例如 BGE-M3 输出 1024 维)
vector_list = embeddings.embed_documents(texts=documents)
# 打印第一个文档向量的维度,验证嵌入是否成功
# 例如 BGE-M3 默认输出 1024 维,若打印 1024 则说明正常
print("单个向量的维度:", len(vector_list[0]))
# ========================
# 3. 对单个查询(query)进行向量化
# ========================
# 将用户输入的查询语句(如"巴以冲突")转换为与文档相同空间的向量
# 用于后续计算相似度(如余弦相似度)
vector = embeddings.embed_query(text="巴以冲突")
print("查询向量维度:", len(vector)) # 应与文档向量维度一致
# ========================
# 4. 构建内存向量数据库并实现语义检索
# ========================
# 从 langchain_core 导入 InMemoryVectorStore
# 这是一个轻量级、纯内存的向量存储,适合演示或小规模应用(不适用于生产级大数据)
from langchain_core.vectorstores import InMemoryVectorStore
# 使用 from_texts 类方法,直接从文本列表创建向量数据库
# 内部会自动调用 embeddings 对每条文本进行向量化,并建立索引
vector_store = InMemoryVectorStore.from_texts(
texts=documents, # 原始文本列表
embedding=embeddings # 使用的嵌入模型实例(必须与后续查询使用同一模型)
)
# 从向量库创建一个检索器(Retriever)
# Retriever 是 LangChain 中用于"根据 query 检索相关文档"的标准接口
retriever = vector_store.as_retriever()
# 使用检索器查找与查询"俄乌冲突"最相似的文档
# 默认返回 top-k=4 条结果(但本例只有 3 条文档),按相似度排序
retrieved_documents = retriever.invoke("俄乌冲突")
# 打印检索结果
# 返回的是 Document 对象列表,每个包含 page_content 和 metadata
print("\n检索结果(与'俄乌冲突'最相关的文档):")
for i, doc in enumerate(retrieved_documents):
print(f"{i+1}. {doc.page_content}")