2.模型的创建与调用

1. 模型调用的准备工作

1.1 模型初始化的分类维度

  1. 调用 API 方式
    • 使用提供商官方 SDK :调用厂商原生库(如 openai 官方库),支持最新的原生特性。
    • 使用 LangChain 统一集成 :使用 LangChain 的类或统一接口(推荐),便于切换和链式开发。
  2. 配置参数位置
    • 使用配置文件(.env推荐)。
    • 硬编码:写在代码文件中。
  3. 大模型部署位置
    • 在线部署的大模型.
    • 本地部署的大模型.

1.2 线上大模型服务平台

进行模型配置时,通常需要配置三要素:模型名api-keybase-url 。 进行模型配置时,通常需要配置三要素:模型名api-keybase-url

平台 网址 备注
OpenRouter openrouter.ai 全球主流,含国外模型,支持国内直连与微信/支付宝充值
CloseAI platform.closeai-asia.com 亚洲最大,含国外模型
阿里云百炼 bailian.console.aliyun.com 企业端友好,新用户送5000万Tokens免费额度
硅基流动 siliconflow.cn 性价比高,适合个人,9B以下模型永久免费
百度千帆 console.bce.baidu.com/qianfan 主打百度生态
火山引擎 console.volcengine.com/ark 主打字节多模态生态

1.3 依赖管理

在项目根目录创建 requirements.txt 固定主要依赖版本并执行安装:

bash 复制代码
pip install -r requirements.txt

注:langchain-deepseek 依赖 langchain-openai,安装前者时 pip 会自动拉取并安装后者。


2. 模型初始化的三种方式

初始化模型主要有以下三种方式:

2.1 方式一:使用专有类初始化 (专用 API)

直接使用各模型提供商专属的 Model 类(如 ChatDeepSeekChatZhipuAIChatTongyi 等)。

python 复制代码
import os
from dotenv import load_dotenv
from langchain_deepseek import ChatDeepSeek

load_dotenv(override=True)

# 自动读取环境变量中以 DEEPSEEK_ 开头的配置
model = ChatDeepSeek(
    model="deepseek-v4-flash",
)
print(model.invoke("请介绍一下你自己"))

2.2 方式二:使用兼容类初始化 (ChatOpenAI 兼容模式)

利用 ChatOpenAI 配合自定义的 api_keybase_url 来调用任何兼容 OpenAI 协议规范的第三方平台模型(如阿里云百炼、CloseAI 等)。

python 复制代码
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI

load_dotenv(override=True)

# 兼容调用通义千问模型示例
model = ChatOpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url=os.getenv("DASHSCOPE_BASE_URL"),
    model="qwen-plus"
)

2.3 方式三:使用统一接口初始化 (init_chat_model)

LangChain 1.x 推荐的统一对话模型入口。只需传入模型名称字符串与提供商,内部会自动导入对应的驱动类,极易实现模型切换。

python 复制代码
from langchain.chat_models import init_chat_model

# 自动适配 ChatDeepSeek
model = init_chat_model(
    model="deepseek:deepseek-v4-flash",
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url=os.getenv("DEEPSEEK_BASE_URL")
)

注:对于部分模型(如 qwen-plus),如果不提供前缀或显式指明 model_provider="openai",LangChain 无法自动推断时会报错。


2.4 常用初始化参数表

参数 类型 说明 默认值
model str 使用的特定提供商的模型名称(必需)
model_provider str 模型提供商名称
api_key str API 密钥,若不提供将自动读取对应环境变量 None
base_url str 大模型供应商 API 请求地址 None
temperature float 控制输出随机性,范围 0.0 - 2.0,值越高越随机 0.7
max_tokens int 限制模型输出的最大 token 数量 None
timeout float 超时时间(秒) None
max_retries int 请求失败时的最大重试次数 6

💡 temperature 参数场景推荐:

  • 0.0 - 0.3:需要一致性、准确性的任务(数学计算、数据提取、分类、代码生成)。设为 0 会始终选择概率最高的 Token。
  • 0.5 - 0.7:平衡创造性与一致性(日常聊天、问答)。
  • 0.8 - 1.5:创造性任务(写作、头脑风暴)。
  • 1.5 - 2.0:高度创造性(诗歌、故事创作)。

💡 Token 与字符估算:

  • 1 个中文 Token ≈ 1-1.8 个汉字
  • 1 个英文 Token ≈ 3-4 个字符

3. 本地模型的部署与调用 (Ollama)

3.1 Ollama 简介

Ollama 是一个本地运行大模型的集成框架,可在本地自动化部署和运行如 Qwen、DeepSeek 等主流开源大模型。

  • 官网下载ollama.com/download 支持 macOS, Linux, Windows。
  • Linux 一键安装curl -fsSL https://ollama.com/install.sh | sh

3.2 Ollama 常用命令

命令 一句话说明
ollama pull <model> 下载指定模型(例:ollama pull llama3
ollama run <model> 启动模型并进入交互对话
ollama list 列出本机已下载的所有模型
ollama rm <model> 删除不再需要的模型以节省磁盘
ollama cp <src> <dest> 本地复制/重命名模型
ollama show <model> 查看模型详细信息(参数、大小等)
ollama serve 启动后台服务,供 API 调用
ollama ps 查看当前正在运行的模型进程
ollama stop <model> 停止正在运行的模型

3.3 LangChain 调用本地 Ollama 模型

安装集成依赖包:

bash 复制代码
pip install -qU langchain-ollama
pip install -U ollama

代码实现:

python 复制代码
# 方式一:使用 ChatOllama 专有类
from langchain_ollama import ChatOllama

ollama_llm = ChatOllama(
    model="deepseek-r1:1.5b",
    base_url="http://localhost:11434" # 如果是本地默认端口运行,base_url可省略
)

# 方式二:使用 init_chat_model 统一调用
from langchain.chat_models import init_chat_model

ollama_llm = init_chat_model(
    model="deepseek-r1:1.5b",
    model_provider="ollama"
)

4. 模型的调用方法 (Invocation)

LangChain 提供了多种调用大模型的方法以满足不同的场景。

4.1 核心调用方法对比

同步方法 异步方法 运行模式 适用场景
invoke() ainvoke() 阻塞式,一次性返回完整结果 单次问答、批处理、无实时反馈的场景
stream() astream() 流式输出,实时返回每个 token 的片段 聊天机器人、长文本生成(改善用户体验)
batch() abatch() 批量处理多个输入,在后台并行处理 批量数据标注、文档摘要、高并发场景

4.2 详细用法与返回值

1) invoke() 输入参数的三种格式

  • 文本输入(最简单,无法设置 system prompt 或对话历史)

    python 复制代码
    response = model.invoke("用一句话解释什么是AI")
  • 字典列表(最灵活,推荐,JSON 兼容)

    python 复制代码
    messages = [
        {"role": "system", "content": "你是一个友好的AI助手"},
        {"role": "user", "content": "你好,我叫小明"},
        {"role": "assistant", "content": "你好小明!很高兴认识你。"},
        {"role": "user", "content": "我叫什么名字?"} # AI会通过上下文正确回答出"小明"
    ]
    response = model.invoke(messages)
  • 消息对象列表(面向对象,支持类型检查与 IDE 补全)

    python 复制代码
    from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
    
    messages = [
        SystemMessage(content="你是一个 Python 专家"),
        HumanMessage(content="什么是生成器?")
    ]
    response = model.invoke(messages)

2) AIMessage 返回值内容解析

invoke 调用返回一个 AIMessage 对象,包含以下核心数据:

  • content:模型生成的最终文本。
  • id:本次运行在 LangChain 内部生成的唯一标识符(Run ID)。
  • usage_metadata:经过标准化的 Token 消耗元数据。
    • input_tokens:输入 Token 数。
    • output_tokens:输出 Token 数。
    • total_tokens:总消耗(两者之和)。
  • response_metadata:底层 API 返回的原始响应元数据。
    • model_namemodel_provider:调用的模型名称及提供商。
    • finish_reason:停止生成的原因(stop 正常结束;length 达到最大限制被截断;tool_calls 触发工具调用)。
    • latency_checkpoint:网络及推理延迟(如首字时间等)。

3) stream() 流式调用

python 复制代码
for chunk in model.stream("写一首关于大模型的诗"):
    print(chunk.content, end="", flush=True) # 逐 token 输出

4) batch() 批量调用

  • batch() 方法会并发向后台发送请求,大幅减少网络往返开销与等待时间:

    python 复制代码
    messages = ["你好,你是谁?", "2 + 3 * 5 = ?", "中国首都在哪里?"]
    responses = model.batch(messages)
    for r in responses:
        print(r.content)
  • batch_as_completed() 允许按完成的先后顺序接收响应(乱序返回),其返回迭代器生成 (original_index, response) 格式的元组:

    python 复制代码
    responses = model.batch_as_completed(messages)
    for idx, resp in responses:
        print(f"输入序号: {idx}, 响应: {resp.content}")

5) 异步调用 (ainvoke(), astream(), abatch())

通过异步协程机制,在等待模型网络 IO 时,让出 CPU 执行权限:

python 复制代码
import asyncio

async def demo_async():
    # 创建异步后台任务
    task = asyncio.create_task(model.ainvoke("用一句话解释人工智能。"))
    # 等待的同时可以并发做其他本地计算
    await asyncio.sleep(1) 
    response = await task
    print(response.content)

4.3 异常处理

在实际生产中,API 调用可能会因为配置错误、网络波动而失败,推荐使用 try-except 进行异常捕获:

python 复制代码
try:
    response = model.invoke("Hello")
except ValueError as e:
    print(f"配置错误: {e}")
except ConnectionError as e:
    print(f"网络错误: {e}")
except Exception as e:
    print(f"未知错误: {e}")

5. 拓展内容与进阶用法

5.1 美化模型输出

  • 方法一 :直接调用 AIMessage 对象的内置 .pretty_print() 方法进行格式化打印。

  • 方法二 :在终端开发调试时,使用 rich 库的 rprint 漂亮地打印大对象结构:

    python 复制代码
    from rich import print as rprint
    rprint(response)

5.2 模型配置信息画像 (profile)

在 LangChain 1.1 及更高版本中,部分支持的模型(如 OpenRouter 下的部分平台)可通过 .profile 属性获取该模型的能力画像数据(例如支持的最大上下文、是否支持多模态输入/输出、支持结构化输出等):

python 复制代码
print(model.profile)

注:该属性取决于 LangChain 在集成服务商时是否声明了画像,若无则输出空 {}

5.3 进阶参数透传 (model_kwargsextra_body)

  • model_kwargs :透传底层 API 支持但 LangChain 尚未显式声明的参数。例如透传 tools 参数用于支持 Function Calling 工具调用:

    python 复制代码
    model = init_chat_model(
        model="deepseek-v4-flash",
        model_provider="deepseek",
        model_kwargs={"tools": [...]}
    )
  • extra_body :存放非 OpenAI 标准协议但在个别厂商特有的扩展字段。 例如开启 DeepSeek 的深度思考(thinking)模式

    python 复制代码
    model = init_chat_model(
        model="deepseek:deepseek-v4-flash",
        extra_body={"thinking": {"type": "enabled"}},
    )
    # 调用后返回的 response.additional_kwargs 中会包含 'reasoning_content',即思考链过程

5.4 运行时 config 参数配置

在调用模型时(如 invoke(), batch() 等),可以传入 config 字典来进行单次调用的动态配置(优先级高于模型初始化参数)。

config 常用配置项说明:

  • run_name:在 LangSmith 追踪系统中此次运行会显示的指定名称。

  • tags:打上标签,便于分类检索。

  • metadata :附加的关联字典信息(如 {"user_id": "123"}),会同步传递给后续的链节点。

  • callbacks:注册单次调用的自定义回调。

  • max_concurrency :限制 batch 批量调用的最大并发并发请求数(如限制并发为 5),防止触发限流。

    python 复制代码
    model.batch(large_list, config={"max_concurrency": 5})
  • configurable :配合初始化时的 configurable_fields 动态在运行时覆盖模型的配置:

    python 复制代码
    # 1. 初始化时声明允许修改的字段
    model = init_chat_model(
        model="deepseek-v4-flash",
        model_provider="deepseek",
        configurable_fields=("model", "temperature")
    )
    
    # 2. 运行时通过 config 动态覆盖
    config = {
        "configurable": {
            "model": "deepseek-v4-pro",
            "temperature": 0.1
        }
    }
    response = model.invoke("1 + 1 = ?", config=config)
相关推荐
dong_junshuai2 小时前
每天一个开源项目#99 OpenResearch:2.2K星的本地研究Agent工作台
开源·github·agent
花椒技术2 小时前
把 AI 视频接进直播:提前生成、按次生成、持续生成怎么选?
agent·音视频开发
用户8082598666872 小时前
用 LangGraph 重写自己手写的 Agent:框架替你解决了什么,什么它不管
agent
能不能静下心来看2 小时前
从 RAG 到 Agent:跑通两个 Demo 后,我终于分清了这两个词
agent
ZGi.ai2 小时前
知识库权限变了,怎样避免答错?
agent·权限管理·知识库·工作流·zgi·客服运营
大模型真好玩3 小时前
DeepSeek Harness 入门很简单(四)——DeepSeek Harness接入插件
人工智能·agent·deepseek
掰头战士3 小时前
MCP、Skill、Plugin,都是给agent拓展能力,到底有何区别?
typescript·llm·agent
嘟嘟嘟95274 小时前
AI Agent 的边缘困境
人工智能·架构·agent
HYDtomako4 小时前
Agent checkpoint设计
ai·agent·checkpoint·claude code
梦在远山后5 小时前
从需求到架构:我的企业研发 Agent 整体设计
langchain·agent