1. 模型调用的准备工作
1.1 模型初始化的分类维度
- 调用 API 方式 :
- 使用提供商官方 SDK :调用厂商原生库(如
openai官方库),支持最新的原生特性。 - 使用 LangChain 统一集成 :使用 LangChain 的类或统一接口(推荐),便于切换和链式开发。
- 使用提供商官方 SDK :调用厂商原生库(如
- 配置参数位置 :
- 使用配置文件(
.env,推荐)。 - 硬编码:写在代码文件中。
- 使用配置文件(
- 大模型部署位置 :
- 在线部署的大模型.
- 本地部署的大模型.
1.2 线上大模型服务平台
进行模型配置时,通常需要配置三要素:模型名 、api-key 和 base-url 。 进行模型配置时,通常需要配置三要素:模型名 、api-key 和 base-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 类(如 ChatDeepSeek、ChatZhipuAI、ChatTongyi 等)。
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_key 和 base_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 或对话历史) :
pythonresponse = model.invoke("用一句话解释什么是AI") -
字典列表(最灵活,推荐,JSON 兼容) :
pythonmessages = [ {"role": "system", "content": "你是一个友好的AI助手"}, {"role": "user", "content": "你好,我叫小明"}, {"role": "assistant", "content": "你好小明!很高兴认识你。"}, {"role": "user", "content": "我叫什么名字?"} # AI会通过上下文正确回答出"小明" ] response = model.invoke(messages) -
消息对象列表(面向对象,支持类型检查与 IDE 补全) :
pythonfrom 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_name和model_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()方法会并发向后台发送请求,大幅减少网络往返开销与等待时间:pythonmessages = ["你好,你是谁?", "2 + 3 * 5 = ?", "中国首都在哪里?"] responses = model.batch(messages) for r in responses: print(r.content) -
batch_as_completed()允许按完成的先后顺序接收响应(乱序返回),其返回迭代器生成(original_index, response)格式的元组:pythonresponses = 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漂亮地打印大对象结构:pythonfrom rich import print as rprint rprint(response)
5.2 模型配置信息画像 (profile)
在 LangChain 1.1 及更高版本中,部分支持的模型(如 OpenRouter 下的部分平台)可通过 .profile 属性获取该模型的能力画像数据(例如支持的最大上下文、是否支持多模态输入/输出、支持结构化输出等):
python
print(model.profile)
注:该属性取决于 LangChain 在集成服务商时是否声明了画像,若无则输出空 {}。
5.3 进阶参数透传 (model_kwargs 和 extra_body)
-
model_kwargs:透传底层 API 支持但 LangChain 尚未显式声明的参数。例如透传tools参数用于支持 Function Calling 工具调用:pythonmodel = init_chat_model( model="deepseek-v4-flash", model_provider="deepseek", model_kwargs={"tools": [...]} ) -
extra_body:存放非 OpenAI 标准协议但在个别厂商特有的扩展字段。 例如开启 DeepSeek 的深度思考(thinking)模式 :pythonmodel = 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),防止触发限流。pythonmodel.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)