【自然语言处理与大模型】LangChainV1.0入门指南:核心组件Models

本文介绍Langchain如何接入chat模型和embedding模型。

一、如何接入Chat模型?

1、使用ChatOpenAI接入

ChatOpenAI - LangChain 提供的文档 --- ChatOpenAI - Docs by LangChainhttps://docs.langchain.com/oss/python/integrations/chat/openai

(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 strList[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 LangChainhttps://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 LangChainhttps://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模型?

Embedding models - Docs by LangChainhttps://docs.langchain.com/oss/python/integrations/text_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}")
相关推荐
oscar9993 小时前
深度学习测试题与解析
人工智能·深度学习·测试题
Ama_tor3 小时前
AI-agent|从人工智能代理角度再延伸至扣子编程
人工智能
北冥有一鲲3 小时前
LangChain 框架前世今生:从“万能接口”到“AI 应用全家桶”
人工智能·chatgpt·langchain
MuseDAM_cc3 小时前
企业素材找不到?DAM 3 步解决资产分散
大数据·人工智能
AI即插即用3 小时前
即插即用系列 | 2025 RestorMixer:融合 CNN、Mamba 与 Transformer 的高效图像复原的集大成者!
人工智能·深度学习·神经网络·目标检测·计算机视觉·cnn·transformer
hay_lee3 小时前
LLaDA2.0:蚂蚁开源业内首个 100B 扩散语言模型
人工智能·语言模型·自然语言处理·llada2.0
upper20203 小时前
数据挖掘10
人工智能·数据挖掘
黑客思维者3 小时前
机器学习011:监督学习【回归算法】(多项式回归)-- 从“猜咖啡温度”到预测万物
人工智能·学习·机器学习·回归·线性回归·监督学习·多项式回归
小杨互联网3 小时前
时间序列预测实战:LSTM vs Transformer 在公共交通乘客量预测中的对比
人工智能·lstm·transformer