Model I/O - 模型调用4、不同平台的模型调用实战4.1 通过 CloseAI 代理调用 OpenAICloseAI 提供与 OpenAI 完全兼容的 API 接口只需替换 base_url 。.env 配置OPENAI_API_KEYsk-你的CloseAI密钥 OPENAI_BASE_URLhttps://api.closeai-asia.com/v11.代码示例fromlangchain_openaiimportChatOpenAIfromdotenvimportload_dotenv load_dotenv()# 无需手动传参自动读取环境变量 OPENAI_API_KEY 和 OPENAI_BASE_URLllmChatOpenAI(modelgpt-4o-mini)responsellm.invoke(你好介绍一下LangChain)print(response.content)要点CloseAI 的接口和 OpenAI 完全一致代码无需任何适配。 langchain-openai 包会自动识别 OPENAI_API_KEY 和 OPENAI_BASE_URL 这两个环境变量。4.2 直连 DeepSeekDeepSeek 的 API 兼容 OpenAI 接口格式可以直接使用 ChatOpenAI 。1.env 配置DEEPSEEK_API_KEYsk-你的DeepSeek密钥 DEEPSEEK_BASE_URLhttps://api.deepseek.com/v12.代码示例importosfromlangchain_openaiimportChatOpenAIfromdotenvimportload_dotenv load_dotenv()# DeepSeek 兼容 OpenAI 接口直接用 ChatOpenAI 即可llmChatOpenAI(modeldeepseek-chat,# DeepSeek-V3.2api_keyos.getenv(DEEPSEEK_API_KEY),base_urlos.getenv(DEEPSEEK_BASE_URL),)responsellm.invoke(用一句话解释什么是大语言模型)print(response.content)提示DeepSeek 也提供了专用的 langchain-deepseek 包 uv add langchain-deepseek 用法类似。但由于 DeepSeek 兼容 OpenAI 格式直接用 ChatOpenAI 更简单不需要多装一个包。4.3 硅基流动调用开源模型硅基流动聚合了 50 开源模型DeepSeek、Qwen、GLM 等同样兼容 OpenAI 接口格式。.env 配置SILICONFLOW_API_KEYsk-你的硅基流动密钥 SILICONFLOW_BASE_URLhttps://api.siliconflow.cn/v11.代码示例importosfromlangchain_openaiimportChatOpenAIfromdotenvimportload_dotenv load_dotenv()# 硅基流动的模型名称格式厂商/模型名llmChatOpenAI(modelQwen/Qwen3-8B,api_keyos.getenv(SILICONFLOW_API_KEY),base_urlos.getenv(SILICONFLOW_BASE_URL),)responsellm.invoke(什么是量子计算)print(response.content)省钱技巧硅基流动新用户送 2000 万 Token部分模型如 Qwen3-8B完全免费非常适合学习阶段使用。4.4 接入不兼容 OpenAI 格式的平台4.1 ~ 4.3 的平台都兼容 OpenAI 格式所以直接用 ChatOpenAI 就能搞定。但 AnthropicClaude和GoogleGemini有自己的 API 格式需要用对应的专用类或者用 2.4 节介绍的 init_chat_model统一管理fromlangchain.chat_modelsimportinit_chat_modelfromdotenvimportload_dotenvimportos load_dotenv()# 一个函数搞定所有提供商通过 model_provider 参数区分llm_openaiinit_chat_model(gpt-5.4-nano-2026-03-17,model_provideropenai,api_keyos.getenv(OPENAI_API_KEY),base_urlos.getenv(OPENAI_BASE_URL))llm_claudeinit_chat_model(claude-opus-4-7,model_provideranthropic,api_keyos.getenv(ANTHROPIC_API_KEY),base_urlos.getenv(ANTHROPIC_BASE_URL))llm_geminiinit_chat_model(gemini-3.1-flash-lite-preview,model_providergoogle_genai,api_keyos.getenv(GEMINI_API_KEY),base_urlos.getenv(GEMINI_BASE_URL))# 调用方式完全一致forname,llmin[(OpenAI,llm_openai),(Claude,llm_claude),(Gemini,llm_gemini)]:responsellm.invoke(用一句话介绍你自己)print(f{name}:{response.content})4.5 各平台接入速查表平台用哪个类模型名称示例环境变量OpenAI(CloseAI代理)ChatOpenAIgpt-4o-miniOPENAI_API_KEY OPENAI_BASE_URLDeepSeekChatOpenAIdeepseek-chatDEEPSEEK_API_KEY DEEPSEEK_BASE_URL硅基流动ChatOpenAIQwen/Qwen3-8BSILICONFLOW_API_KEY SILICONFLOW_BASE_URLAnthropicChatAnthropicclaude-sonnet-4-20250514ANTHROPIC_API_KEYGoogleChatGoogleGenerativeAIgemini-2.5-flashGOOGLE_API_KEYOllama (本地)chat0llamaqwen3.5:4b无需API Key发现规律了吗 凡是兼容 OpenAI 接口格式的平台DeepSeek、硅基流动 等都可以直接用ChatOpenAI 只需改 base_url 和 api_key 。这就是标准化接口的威力。5、调用本地模型5.1 Ollama介绍Ollama是一个开源项目用于在本地运行大语言模型。特点支持多种开源模型Llama、Qwen、DeepSeek等一键下载和运行适合原型开发和本地测试提供OpenAI兼容的API5.2 Ollama安装Windows系统访问 https://ollama.com/download下载并安装.exe文件Linux系统curl-fsSLhttps://ollama.com/install.sh|sh5.3 模型下载和运行# 下载并运行模型首次使用会自动下载 ollama run qwen3.5:4b # 列出已下载的模型 ollama list # 查看模型信息 ollama show qwen3.5:4b5.4 使用LangChain调用Ollama# uv add langchain-ollamafromlangchain_ollamaimportChatOllama# 基本用法ollama_llmChatOllama(modelqwen3.5:4b,base_urlhttp://localhost:11434)responseollama_llm.invoke(你好介绍一下你自己)print(response.content)6、高级主题6.1 多模态输入支持图像、音频等多模态输入importbase64fromlangchain_openaiimportChatOpenAIfromlangchain_core.messagesimportHumanMessage llmChatOpenAI(modelgpt-4o)# 需要使用支持视觉语言的模型VLM模型:视觉语言模型 LLM 模型# 视觉模型只能看懂图片的内容(OCR---yolox yolo-v8)# 视觉语言模型即能看懂图片内容 也能把看到的内容输出出来VLM:各个平台都有各种各样的视觉模型# 读取图片withopen(image.jpg,rb)asf:image_dataf.read()messageHumanMessage(content[{type:text,text:描述这张图片},{type:image_url,image_url:{url:fdata:image/jpeg;base64,{base64.b64encode(image_data).decode()}}]# type:image_url :既支持远程可以访问的图片地址 也支持本地图片(不能把本地图片路径丢给它 本地图片内容)responsellm.invoke([message])print(response.content)1.扩展Base64 编码概念 将二进制数据编码为可打印文本常用于在文本协议如 JSON中传输二进制数据。编码原理 原始二进制每个字节可以是 0-255 中的任意值其中很多是不可打印的控制字符无法直接放进 JSON。Base64 将每 3 个字节24 比特切分为 4 组每组 6 比特每组对应 64 个可打印字符之一A-Z、a-z、0-9、、/。如果末尾不足 3 个字节用 填充。importbase64# 编码withopen(image.png,rb)asf:binary_dataf.read()2.bytes: 原始二进制base64_bytesbase64.b64encode(binary_data)# bytes: Base64 编码后仍是 bytes 类型base64_stringbase64_bytes.decode(utf-8)# str: 转成字符串Python 类型要求# .decode(utf-8) 的作用# Python 的 b64encode 返回 bytes 类型但 JSON/f-string 需要 str 类型# 因为 Base64 输出全是 ASCII 字符所以这里只是做类型转换不涉及字符编码解读# 解码binary_database64.b64decode(base64_string)3.在 VLM 中的应用原始图片二进制 | ▼ base64.b64encode() Base64 字符串iVBORw0KGgoAAAANSUhEUgAA... | ▼ 拼接为 Data URL data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAA... | | | | | | | | — 实际的图片数据 | | | — 编码方式 | — 媒体类型告诉 API 这是 JPEG 图片 — Data URL 协议前缀6.2 速率限制importtimefromlangchain_openaiimportChatOpenAIfromlangchain_core.rate_limitersimportInMemoryRateLimiter rate_limiterInMemoryRateLimiter(requests_per_second0.1,# 10 秒才产生 1 个令牌 也即10 秒只能发1 个请求check_every_n_seconds0.1,# 每 0.1 秒检查一下“桶里有没有令牌可以用”)llmChatOpenAI(modelgpt-4o-mini,rate_limiterrate_limiter,)deftest_rate_limit(n3):print(开始时间,time.strftime(%X))lasttime.time()foriinrange(n):t0time.time()respllm.invoke(f第{i}次调用简单回一句话就行)t1time.time()print(f调用{i}完成耗时{t1-t0:.2f}s, f距上次调用结束间隔{t1-last:.2f}s)lastt1 test_rate_limit(3)6.3 Token使用追踪fromlangchain_core.callbacksimportget_usage_metadata_callback llmChatOpenAI(modelgpt-4o-mini)withget_usage_metadata_callback()ascb:llm.invoke(你好)llm.invoke(再见)print(cb.usage_metadata)# {# input_tokens: 总输入token数,# output_tokens: 总输出token数,# total_tokens: 总token数# }6.4 模型配置文件查看模型的能力和限制llmChatOpenAI(modelgpt-4o)print(llm.profile)# {# max_input_tokens: 128000,# image_inputs: True,# tool_calling: True,# structured_output: True,# ...# }6.5 提示词缓存Prompt Caching6.5.1 什么是提示词缓存当你反复用同一段很长的系统提示词System Prompt调用模型时模型每次都要重新读这段提示词消耗时间和 token 费用。提示词缓存让模型服务商在服务器端缓存这段已处理的提示词后续调用直接复用跳过重复计算。第1次调用 [系统提示词 3000字] [用户问题] → 模型处理全部内容 → $ 全价计费 第2次调用缓存命中 [系统提示词 3000字 ← 已缓存跳过] [用户问题] → 模型只处理新内容 → $ 大幅省钱关键认知这里的缓存发生在模型服务商的服务器上不是你本地硬盘上的某个文件。你的项目目录里不会多出 cache.sqlite 之类的东西。6.5.2 不同平台的缓存机制平台缓存方式你需要做什么省多少OpenAI全自动什么都不用做,OpenAI 自动识别相同前缀并缓存缓存命中的 token 费用减半Anthropic显式标记用中间件告诉 API 这段可以缓存缓存命中的 token 费用降低 90%1.OpenAI — 自动缓存零配置fromlangchain_openaiimportChatOpenAI llmChatOpenAI(modelgpt-4o-mini)# 不需要任何额外配置# OpenAI 会自动识别如果连续多次请求的前缀如系统提示词相同# 服务器会复用已计算的 KV cache减少延迟和费用responsellm.invoke(你好)你在代码层面看不到缓存存在哪或命中率多少只能通过费用账单感知到缓存生效了。2.Anthropic — 显式缓存需要中间件fromlangchain_anthropicimportChatAnthropic,AnthropicPromptCachingMiddleware llmChatAnthropic(modelclaude-sonnet-4-20250514,# 中间件会自动把长的系统提示词标记为可缓存middleware[AnthropicPromptCachingMiddleware()])# 第1次调用全价缓存写入# 第2次及之后缓存命中token 费用降低 90%responsellm.invoke(你好)AnthropicPromptCachingMiddleware 的作用是按照 Anthropic 的 API 规范将系统提示词等长文本片段包装成带 cache_control 标记的请求告诉 Anthropic 服务器这段内容可以缓存。缓存的存储和命中完全由 Anthropic 服务端负责LangChain 只负责标记。6.5.4 提示词缓存 vs 本地缓存这是两个完全不同的东西不要混淆维度提示词缓存 (Prompt Caching)本地缓存 (LLM Cache)缓存位置模型服务商的服务器你本地的内存/磁盘/Redis缓存什么效果已计算的提示词中间状态 (KV cache)减少 token 费用和延迟完整的问题→回答键值对相同问题完全不调 API,零费用你能控制吗不能完全由你控制本节讲的√ 是这个✕ 不是这个如果你需要相同问题直接从本地返回、完全不打 API的缓存那是 LangChain 的 LLMCache 机制如 InMemoryCache 、 SQLiteCache 属于另一个话题。7、小结本节介绍了Model I/O中的模型调用部分7.1 已学内容主题核心要点Model I/O概述Prompts → Models → Output Parsers 三部分初始化模型init_chat_model 或特定包的类消息类型SystemMessage, HumanMessage, AlMessage, ToolMessage调用方式invoke, ainvoke, stream, batch平台接入CloseAI代理、DeepSeek、硅基流动、init_chat_model统一切换本地模型Ollama等框架高级特性多模态、速率限制、Token追踪7.2 统一接口优势# 同样的代码只需更换初始化方式即可切换模型llminit_chat_model(gpt-4o-mini,model_provideropenai)llminit_chat_model(claude-sonnet-4-6,model_provideranthropic)llminit_chat_model(gemini-2.5-flash,model_providergoogle)llmChatOllama(modelqwen2.5:7b)# 本地模型# 调用方式完全一致responsellm.invoke(你好)7.3 参考资料LangChain Models 官方文档LangChain Messages 文档Ollama 官网