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)
相关推荐
SelectDB技术团队1 小时前
Agent 可观测性:Apache Doris / SelectDB 的技术能力、选型对比与实践
数据库·人工智能·agent·可观测·ai-native·apache doris·selectdb
怕浪猫2 小时前
第15章 安全、伦理与合规
langchain·openai·agent
早春的树长在理想三旬2 小时前
工具抽象的艺术:可插拔Skill系统的设计哲学
人工智能·agent·springai
新知图书2 小时前
向量数据库集成(Chroma/Pinecone/Milvus)
人工智能·agent·多模态·ai agent·智能体
qcx232 小时前
SpaCellAgent:用 LLM 多智能体怎么用于单细胞轨迹分析的?效率提升了多少?
人工智能·gpt·安全·ai·机器人·llm·agent
吴佳浩3 小时前
为什么 MCP、Skill、RAG 能工作?从 Conversation Loop 看现代 Agent 的底层架构
人工智能·llm·agent
To_OC11 小时前
手写 AI 编程 Agent 的命令执行工具:我被 child_process 坑出来的实战经验
后端·node.js·agent
YIAN17 小时前
从手写 Agent 工具到 MCP 协议:一文搞懂大模型跨进程跨语言工具调用
后端·agent·mcp
为你学会写情书18 小时前
一图入,一声出——多模态输入与 TTS 输出的完整链路
agent