2.模型接口

模型IO

一、核心概念:什么是 ModelIO

1. 定义

LangChain 只是胶水框架,本身不具备大模型能力,核心作用是统一对接各类厂商大模型。
ModelIO 就是模型交互三件套规范

  1. 输入:Prompt 提示词(system/user/ai 消息)
  2. 处理:调用大模型推理
  3. 输出:标准化结构化返回(文本/JSON/流式分片等)

2. 两大核心模型类型

  1. ChatModel 对话模型:日常聊天问答,支持多轮角色消息(system/human/ai),工作中使用占比90%;
  2. Embedding 向量模型:文本向量化,用于向量数据库、RAG检索,本章暂不展开。

3. 通用底层协议:OpenAI 兼容协议

国内绝大多数大模型(通义千问、DeepSeek、智谱等)都兼容 OpenAI 接口规范,是通用标准(普通话)
各厂商也提供专属封装类(方言),适合企业独家采购场景,二选一使用。

4. 关键通用参数

参数 作用 取值范围
api_key 厂商密钥,环境变量读取,避免硬编码 厂商后台申请
base_url 模型接口地址,兼容模式必填 各厂商官方地址
temperature 生成随机性 0~2.0,越小越严谨,越大创造力越强
max_tokens 单次输出最大字数 None=不限制
timeout/max_retries 超时、重试次数,保障稳定性 自定义数值

二、三类调用方案总览

LangChain 提供三套调用写法,按通用度排序:

  1. init_chat_model:LangChain 新版通用标准写法(推荐,一套代码切换多模型)
  2. 厂商专属 ChatXXX(ChatOpenAI/ChatDeepSeek/ChatTongyi):厂商专属封装,适合独家采购场景
  3. 原生 OpenAI SDK:不依赖 LangChain,纯原生调用,老旧项目使用

三、厂商代码

方案1:通用兼容写法 init_chat_model(首选)

统一入口,仅修改 model/model_provider/base_url/api_key 即可切换模型,多模型动态切换首选。

示例1:调用 DeepSeek

# ModelIO_Init_chat_model.py
# 1.导入依赖
import os
from langchain.chat_models import init_chat_model
# 2.实例化模型
model = init_chat_model(
    model="deepseek-chat",
    api_key=os.getenv("deepseek-api"),
    base_url="https://api.deepseek.com"
)
# 3.调用模型
print(model.invoke("你是谁").content)

代码解析

  1. init_chat_model:LangChain 统一初始化入口;
  2. os.getenv():从环境变量读取密钥,安全规范,禁止写死API Key;
  3. base_url:DeepSeek 官方兼容接口地址;
  4. model.invoke():同步调用,返回 AI Message 对象,.content 取出文本结果。

示例2:带调参通用写法(temperature 控制随机性)

# ModelIO_Params.py
import os
from langchain.chat_models import init_chat_model
model = init_chat_model(
    model="deepseek-chat",
    model_provider="openai", # 底层遵循openai协议
    api_key=os.getenv("deepseek-api"),
    base_url="https://api.deepseek.com",
    temperature=2.0 # 高温度,输出更有创意
)
# 循环生成3句短句
for x in range(3):
    print(model.invoke("写一句关于春天的词,14字以内").content)

重点temperature=2.0 想象力拉满;写严谨文案、代码生成建议设 0~0.3

方案2:厂商专属封装类(企业独家场景专用)

每个厂商独立依赖包,仅对接单一模型,适合公司签订独家模型、不允许多模型混用场景。

2.1 ChatDeepSeek 纯DeepSeek专属调用

# ModelIO_DeepSeek.py
import os
from langchain_deepseek import ChatDeepSeek
# 初始化 deepseek
model = ChatDeepSeek(
    model="deepseek-chat",
    temperature=0, # 低温度,输出稳定统一
    max_tokens=None,
    timeout=None,
    max_retries=2, # 请求失败自动重试2次
    api_key=os.getenv("deepseek-api"),
)
# 同步调用
print(model.invoke("什么是LangChain?100字以内回答,简洁"))

特性:无需手动传 base_url,源码内置DeepSeek默认接口地址,简化编码。

2.2 ChatTongyi 阿里通义千问(两种导入方式)

方式A:OpenAI兼容模式(langchain-openai)
# ModelIO_ChatOpenAI.py 对接通义
from langchain_openai import ChatOpenAI
import os
chatLLM = ChatOpenAI(
    api_key=os.getenv("aliQwen-api"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model="qwen-plus",
)
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "你是谁?"}]
response = chatLLM.invoke(messages)
print(response.content)

原理:阿里云百炼提供OpenAI兼容接口,复用ChatOpenAI类,不用额外安装阿里专属包。

方式B:阿里原生 ChatTongyi(专属包,支持流式输出)
# ModelIO_Ollama.py / ModelIO_Qwen.py
# 安装依赖:pip install langchain-community dashscope
import os
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.messages import HumanMessage
chatLLM = ChatTongyi(
    model="qwen-plus",
    api_key=os.getenv("aliQwen-api"),
    streaming=True, # 开启流式输出
)
# 1.同步一次性返回
print(chatLLM.invoke("你是谁"))
print("*" * 60)
# 2.流式分片输出(打字机效果)
res = chatLLM.stream([HumanMessage(content="你好,你是谁")])
for r in res:
    print("chat resp:", r.content)

关键知识点

  1. streaming=True + .stream():流式输出,逐字返回内容,前端聊天框常用;
  2. HumanMessage:LangChain 标准消息对象,区分system/user/ai角色;
  3. 依赖包:langchain-community 存放各厂商第三方集成类。

方案3:原生 OpenAI SDK(不依赖LangChain)

无框架依赖,纯原生请求,老旧项目、不想引入LangChain时使用:

# ModelIO_OpenAI.py
# 安装:pip install openai
import os
from openai import OpenAI
client = OpenAI(
    api_key=os.getenv("deepseek-api"),
    base_url="https://api.deepseek.com"
)
response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[
        {"role": "system", "content": "You are a helpful assistant"},
        {"role": "user", "content": "Hello,你是谁"},
    ],
    stream=False # 关闭流式,一次性返回
)
# 取值路径固定:choices[0].message.content
print(response.choices[0].message.content)

优缺点

  • 优点:无第三方框架耦合,轻量;
  • 缺点:多模型切换需要重复写大量初始化代码,缺少LangChain的提示词、RAG、工具链生态。

四、三种调用方式选型对比

写法 适用场景 优点 缺点
init_chat_model 通用项目、多模型动态切换 一套代码兼容所有厂商,简洁易维护 新版本LangChain才支持
ChatXXX厂商专属类 企业独家采购,仅使用单一模型 内置厂商地址,参数适配更完善 切换模型需修改导入和实例代码
原生OpenAI SDK 轻量化项目、无LangChain依赖 依赖少,底层可控 无LangChain上层工具生态,重复代码多

五、实操开发规范总结

  1. 密钥管理:统一使用 os.getenv() 读取环境变量,禁止明文写API Key;
  2. 多模型通用场景:优先使用 init_chat_model
  3. 企业独家模型场景:使用厂商专属类(ChatDeepSeek/ChatTongyi);
  4. 流式对话需求:开启 streaming=True,使用 .stream() 循环分片读取;
  5. 调参技巧:代码生成/严谨问答 temperature=0;创意文案/写作 temperature=1.5~2.0
  6. 依赖安装
    • 通用OpenAI兼容:pip install langchain-openai
    • DeepSeek专属:pip install langchain-deepseek
    • 通义千问:pip install langchain-community dashscope
  7. 返回值统一规则
    所有LangChain调用返回 AIMessage 对象,通过 .content 获取文本内容;原生SDK需通过 choices[0].message.content 取值。
posted @ 2026-08-17 18:24  _丑小鸭  阅读(1)  评论(0)    收藏  举报