2026/2/17 21:07:21
网站建设
项目流程
怎么在wordpress上设计网站,网站搭建联系方式,推广运营是什么工作,鄂尔多斯网站开发前言
在前三篇关于 LangChain 的系列文章中#xff0c;我们从框架本质讲起#xff0c;逐步搭建了可运行的 Demo#xff0c;并深入探讨了其在真实业务系统中的集成架构。
现在#xff0c;我们进入一个更贴近工程实践的核心议题#xff1a;
当你的 AI 系统不再只依赖单一…前言在前三篇关于 LangChain 的系列文章中我们从框架本质讲起逐步搭建了可运行的 Demo并深入探讨了其在真实业务系统中的集成架构。现在我们进入一个更贴近工程实践的核心议题当你的 AI 系统不再只依赖单一模型而是需要同时调用本地小模型、云端大模型、多模态模型甚至要在运行时动态切换主备模型时代码里堆满各种 API 调用和配置参数将迅速变得不可维护。这正是企业级 AI 应用普遍采用LLM Gateway大语言模型网关架构的根本原因。LLM Gateway 不仅是一个技术中间件更是一种工程治理思想——它将模型调用抽象为统一服务屏蔽底层差异实现配置解耦、计费统一、热升级无感。而 LangChain 作为主流的 LLM 应用开发框架天然支持与符合 OpenAI SDK 兼容标准的网关无缝集成。本文将详细拆解这一集成机制说明为何 OpenAI 兼容性是企业自研网关的“黄金标准”并给出可直接落地的代码范式。无论你是正在构建第一个 AI Agent还是优化已有系统的模型调度层理解 LLM Gateway 的设计逻辑都将极大提升你的工程效率与系统稳定性。1. 企业级 AI 应用为何必须引入 LLM Gateway现代 AI 应用很少只依赖单一模型。业务场景的复杂性决定了我们需要组合使用不同特性的模型。性能与成本的权衡快模型如 qwen-turbo用于高频、低复杂度任务以控制成本慢模型如 qwen-max用于高精度、关键决策场景。能力互补文本生成模型处理对话多模态模型解析图像本地模型保障数据隐私。高可用需求主模型故障时需自动切换至备用模型避免服务中断。迭代敏捷性新模型上线或旧模型下线不应影响上层业务代码。若没有统一的调度层这些需求会导致模型配置散落在各处修改需逐个文件调整。计费逻辑分散难以统一监控和优化成本。切换模型需重新部署整个应用风险高、周期长。LLM Gateway 正是为解决这些问题而生。它作为一个独立的 Web 服务封装所有模型的接入细节对外提供统一的 API 接口。业务层只需与 Gateway 交互无需关心背后是 Ollama、阿里百炼还是自研模型。比如説像以下这个某巨型连锁超市的O2O APP的在线智能客服架构在过了验证阶段后由于事先铺设了llm gateway因此在当具备了本地数据中心内私布模型后只需要“一刀切掉SAAS化服务”的那条链路即可而且是在白天运营时间切换时客户是无感知的。1.1 LLM Gateway 的核心价值统一入口所有模型调用通过同一组 URL 和认证方式完成。透明路由根据请求参数如 model 字段自动路由到对应后端。集中计费在 Gateway 层统一计算 token 消耗便于成本分摊与审计。无感切换更换后端模型只需修改 Gateway 配置业务代码零改动。协议标准化强制要求后端模型适配统一接口降低集成复杂度。这种架构在业界已成为事实标准。几乎所有成熟的 AI Agent 平台如 Dify、LangSmith 生态中的私有部署方案都内置或推荐使用 LLM Gateway 模式。2. LangChain 如何与自定义 LLM Gateway 集成LangChain 本身不强制绑定特定模型提供商。它的ChatOpenAI类设计初衷虽为 OpenAI 官方 API但因其广泛采用已成为一种事实上的行业协议。只要你的 LLM Gateway 实现了 OpenAI 的 API 规范LangChain 就能直接调用。2.1 关键前提OpenAI SDK 兼容性所谓 “OpenAI SDK 兼容”指的是你的 LLM Gateway 必须提供以下两个核心接口且响应格式与 OpenAI 完全一致/v1/models返回可用模型列表。/v1/chat/completions处理聊天请求支持流式stream与非流式blocking两种模式。这是 LangChainChatOpenAI类内部调用的硬性要求。若接口路径或响应结构不符将导致解析失败。2.1.1/v1/models接口规范该接口应返回 JSON 格式的模型列表结构如下json复制代码{ object: list, data: [ { id: alibailian/qwen3-max, object: model, created: 1700000000, owned_by: alibaba }, { id: ollama/llama3.2, object: model, created: 1700000000, owned_by: local } ] }id字段即为用户在调用时指定的模型名称必须全局唯一。2.1.2/v1/chat/completions非流式响应当请求中streamfalse默认时返回完整响应json复制代码{ id: chatcmpl-123, object: chat.completion, created: 1700000000, model: alibailian/qwen3-max, choices: [ { index: 0, message: { role: assistant, content: 你好我是通义千问很高兴为你服务。 }, finish_reason: stop } ], usage: { prompt_tokens: 10, completion_tokens: 15, total_tokens: 25 } }LangChain 会从choices[0].message.content提取文本内容。2.1.3/v1/chat/completions流式响应当streamtrue时服务器应返回text/event-stream每块数据为一个独立的 JSON 对象以data:开头\n\n结尾text复制代码data: {id:chatcmpl-123,object:chat.completion.chunk,created:1700000000,model:alibailian/qwen3-max,choices:[{index:0,delta:{role:assistant},finish_reason:null}]} data: {id:chatcmpl-123,object:chat.completion.chunk,created:1700000000,model:alibailian/qwen3-max,choices:[{index:0,delta:{content:你},finish_reason:null}]} data: {id:chatcmpl-123,object:chat.completion.chunk,created:1700000000,model:alibailian/qwen3-max,choices:[{index:0,delta:{content:好},finish_reason:null}]} data: {id:chatcmpl-123,object:chat.completion.chunk,created:1700000000,model:alibailian/qwen3-max,choices:[{index:0,delta:{},finish_reason:stop}]} data: [DONE]LangChain 的stream()方法会逐块解析delta.content并拼接输出。3. 在 LangChain 中封装自定义 LLM Gateway 调用基于上述规范我们可通过ChatOpenAI类直接对接自研网关。为提升代码可维护性建议使用工厂模式封装创建逻辑。3.1 LLMFactory 的设计思路工厂类LLMFactory的核心目标是隐藏模型创建的细节提供统一的创建接口。它应支持本地模型Ollama云厂商模型阿里百炼自定义网关OpenAI 兼容关键在于create_openai方法它接收base_url参数指向你的 LLM Gateway 地址。python复制代码staticmethod def create_openai( model: str, base_url: str, api_key: Optional[str] None, temperature: float 0.7, **kwargs ) - ChatOpenAI: # ... 参数处理 ... return ChatOpenAI( modelmodel, api_keyapi_key, base_urlbase_url, # 指向你的网关 temperaturetemperature, **kwargs )此方法完全复用 LangChain 的 OpenAI 客户端因此只要网关兼容即可无缝工作。3.2 调用示例02_localllmgw.py新建文件02_localllmgw.py演示如何调用本地网关python复制代码# 配置网关地址和模型名 base_url http://localhost:8000/api/llmgateway/v1 model alibailian/qwen3-max # 创建 LLM 实例 llm LLMFactory.create_openai( modelmodel, base_urlbase_url, temperature0.7 ) # 基本调用 response llm.invoke(你好请用一句话介绍一下自己) print(f AI: {response.content}) # 流式输出 for chunk in llm.stream(讲一个关于人工智能的笑话): print(chunk.content, end, flushTrue)这段代码与调用官方 OpenAI API 几乎无异。业务层完全感知不到背后是阿里云还是本地部署的模型。4. 全代码llm_factory.py LLM Factory - Create and manage different LLM providers 支持本地/开源模型Ollama和阿里百炼云模型 from typing import Optional from langchain_ollama import ChatOllama from langchain_community.llms import Tongyi try: from langchain_openai import ChatOpenAI except ImportError: ChatOpenAI None import os from src.utils.logger import log from config.settings import settings class LLMFactory: Factory class for creating LLM instances 支持 - Ollama 本地模型免费 - 阿里百炼/通义千问需要 API Key staticmethod def create_ollama( model: str llama3.2, temperature: float 0.7, base_url: Optional[str] None, **kwargs ) - ChatOllama: Create Ollama Local LLM instance (完全免费本地运行) Args: model: 模型名称 (llama3.2, llama2, llama3.1, mistral, qwen2.5 等) temperature: 采样温度 (0.0-1.0) base_url: Ollama 服务地址如为 None 则从配置文件读取 **kwargs: 其他参数 Returns: ChatOllama instance Example: llm LLMFactory.create_ollama(modelllama3.2, temperature0.7) response llm.invoke(你好) # 从配置文件获取 base_url if base_url is None: base_url settings.ollama_base_url log.info(f[LLM Factory] Creating Ollama LLM) log.info(f[LLM Factory] Model: {model}) log.info(f[LLM Factory] Base URL: {base_url}) log.info(f[LLM Factory] Temperature: {temperature}) return ChatOllama( modelmodel, temperaturetemperature, base_urlbase_url, **kwargs ) staticmethod def create_tongyi( model: str qwen-turbo, temperature: float 0.7, api_key: Optional[str] None, **kwargs ) - Tongyi: 创建阿里百炼/通义千问 LLM 实例 Args: model: 模型名称 - qwen-turbo: 通义千问增强版性价比高 - qwen-plus: 通义千问增强版更强能力 - qwen-max: 通义千问最强版本 - qwen-long: 长文本版本 temperature: 采样温度 (0.0-1.0) api_key: DashScope API Key如为 None 则从环境变量 DASHSCOPE_API_KEY 或 ALIBAILIAN_API_KEY 获取 **kwargs: 其他参数 Returns: Tongyi LLM instance Example: llm LLMFactory.create_tongyi(modelqwen-turbo, temperature0.7) response llm.invoke(你好) 注意 - 需要在 https://dashscope.console.aliyun.com/ 获取 API Key - API Key 可通过环境变量 ALIBAILIAN_API_KEY 或 DASHSCOPE_API_KEY 设置 # 获取 API Key优先使用传入参数其次从环境变量获取 if api_key is None: api_key os.getenv(ALIBAILIAN_API_KEY) or os.getenv(DASHSCOPE_API_KEY) if not api_key: raise ValueError( 未找到 API Key。请通过以下方式之一设置\n 1. 传入 api_key 参数\n 2. 设置环境变量 ALIBAILIAN_API_KEY\n 3. 设置环境变量 DASHSCOPE_API_KEY\n 4. 在 .env 文件中添加 ALIBAILIAN_API_KEYyour_api_key ) log.info(f[LLM Factory] Creating Alibaba Tongyi LLM) log.info(f[LLM Factory] Model: {model}) log.info(f[LLM Factory] Temperature: {temperature}) log.info(f[LLM Factory] API Key: {api_key[:3]}{* * (len(api_key) - 3)}) # 设置环境变量Tongyi 会从环境变量读取 os.environ[DASHSCOPE_API_KEY] api_key return Tongyi( model_namemodel, temperaturetemperature, dashscope_api_keyapi_key, **kwargs ) staticmethod def create_alibailian( model: str qwen-turbo, temperature: float 0.7, api_key: Optional[str] None, **kwargs ) - Tongyi: create_tongyi 的别名更直观的名称 参数和用法与 create_tongyi 完全相同 return LLMFactory.create_tongyi(modelmodel, temperaturetemperature, api_keyapi_key, **kwargs) staticmethod def create_openai( model: str, base_url: str, api_key: Optional[str] None, temperature: float 0.7, **kwargs ) - ChatOpenAI: 创建 OpenAI 兼容接口的 LLM 实例 (可用于本地网关、OpenAI、DeepSeek 等) Args: model: 模型名称 (如 alibailian/qwen3-max) base_url: 接口地址 (如 http://localhost:8000/api/llmgateway/v1) api_key: API Key如为 None 则从环境变量获取 temperature: 采样温度 (0.0-1.0) **kwargs: 其他参数 Returns: ChatOpenAI instance if ChatOpenAI is None: raise ImportError(请先安装 langchain-openai: pip install langchain-openai) if api_key is None: api_key os.getenv(ALIBAILIAN_API_KEY) or os.getenv(OPENAI_API_KEY) or sk-no-key log.info(f[LLM Factory] Creating OpenAI Compatible LLM) log.info(f[LLM Factory] Model: {model}) log.info(f[LLM Factory] Base URL: {base_url}) log.info(f[LLM Factory] API Key: {api_key[:3]}{* * (len(api_key) - 3) if api_key else ***}) return ChatOpenAI( modelmodel, api_keyapi_key, base_urlbase_url, temperaturetemperature, **kwargs ) staticmethod def create_default(**kwargs): Create default LLM (使用 Ollama 本地模型) Returns: ChatOllama instance Raises: RuntimeError: 如果 Ollama 不可用 log.info([LLM Factory] Creating default LLM (Ollama)...) try: llm LLMFactory.create_ollama(**kwargs) log.info([LLM Factory] ✓ Ollama LLM created successfully) return llm except Exception as e: log.error(f[LLM Factory] ✗ Failed to create Ollama LLM: {e}) raise RuntimeError( Ollama 不可用。请按以下步骤安装\n 1. 下载 Ollama: https://ollama.com/download\n 2. 安装后运行: ollama run llama3.2\n 3. 等待模型下载完成\n 4. 重新运行程序 ) from e02_localllmgw.py 本地 LLM Gateway 示例 (OpenAI 兼容接口) 适用于通过本地网关调用的模型 import sys from pathlib import Path # Add project root to path project_root Path(__file__).parent.parent.parent sys.path.insert(0, str(project_root)) from src.core.llm_factory import LLMFactory from src.utils.logger import log def example_local_gateway(): 使用本地网关进行对话 print(\n *50) print(示例: 本地 LLM Gateway (OpenAI 兼容)) print(*50) # 配置信息 # 这里的 base_url 对应您 curl 中的 http://localhost:8000/api/llmgateway/v1/chat/completions # LangChain 的 base_url 通常只需要到 v1 这一层 base_url http://localhost:8000/api/llmgateway/v1 model alibailian/qwen3-max try: # 创建 LLM 实例 # 它会自动尝试从环境变量获取 ALIBAILIAN_API_KEY 作为 Authorization Bearer Token llm LLMFactory.create_openai( modelmodel, base_urlbase_url, temperature0.7 ) print(f\n 调用模型: {model}) print(f 网关地址: {base_url}) # 1. 基本调用 print(\n[1. 基本调用]) response llm.invoke(你好请用一句话介绍一下自己) # ChatOpenAI 返回的是 BaseMessage 对象其内容在 .content 中 print(f AI: {response.content}) # 2. 流式输出 print(\n[2. 流式输出]) print( AI: , end, flushTrue) for chunk in llm.stream(讲一个关于人工智能的笑话): print(chunk.content, end, flushTrue) print(\n) except ImportError as e: print(f\n❌ 错误: {e}) except Exception as e: log.error(f运行示例时出错: {e}) print(f\n❌ 运行出错: {e}) if __name__ __main__: example_local_gateway()4.1 如何使用本篇中的代码替换从玩具到工具LangChain 入门 (一)中代码部分的llm_factory.py4.2代码解读在从玩具到工具LangChain 入门 (一)项目中新增02_localllmgw.py文件4.3 实际运行效果2026-01-17 15:06:07 | INFO | src.utils.logger:setup_logger:37 - Logger initialized. Log file: e:\langchain-space\QuickChain\logs\app.log 示例: 本地 LLM Gateway (OpenAI 兼容) 2026-01-17 15:06:07 | INFO | src.core.llm_factory:create_openai:164 - [LLM Factory] Creating OpenAI Compatible LLM 2026-01-17 15:06:07 | INFO | src.core.llm_factory:create_openai:165 - [LLM Factory] Model: alibailian/qwen3-max 2026-01-17 15:06:07 | INFO | src.core.llm_factory:create_openai:166 - [LLM Factory] Base URL: http://localhost:8000/api/llmgateway/v1 2026-01-17 15:06:07 | INFO | src.core.llm_factory:create_openai:167 - [LLM Factory] API Key: sk-********** 调用模型: alibailian/qwen3-max 网关地址: http://localhost:8000/api/llmgateway/v1 [1. 基本调用] AI: 你好我是一个由阿里云研发的超大规模语言模型能够回答问题、创作文字、编程等致力于为你提供准确、有用和友好的帮助。 [2. 流式输出] AI: 当然这里有一个轻松的人工智能笑话 有一天一个人对他的AI助手说“你能讲个笑话吗” AI回答“当然可以不过我得先查一下——‘幽默’在人类情感数据库中的定义是……哦抱歉刚才那个停顿本身就是一个笑话。” 人一脸困惑“这算什么笑话” AI淡定地说“别担心我已经把你的困惑记录下来用于训练下一代更会讲笑话的我。顺便你笑点太低建议升级。” 希望这个笑话能让你会心一笑然后我们看llm gateway上的显示5. 有无 LLM Gateway 的架构对比为直观展示 LLM Gateway 的价值下表对比两种架构的关键差异维度无 LLM Gateway有 LLM Gateway模型配置散落在各业务模块硬编码或分散配置集中在 Gateway 配置中心新增模型需修改所有调用点重新部署仅需在 Gateway 注册业务无感主备切换需代码逻辑判断复杂且易错Gateway 内部路由自动故障转移Token 计费各模型单独统计难以汇总Gateway 统一计算精确到请求协议适配每个模型需单独写适配器所有模型统一输出 OpenAI 格式调试难度多种日志格式排查困难统一日志清晰追踪请求链路笔者认为LLM Gateway 的引入本质上是将“模型即服务”Model as a Service的理念工程化。它把模型从“被调用的资源”转变为“可管理的服务”这是从小作坊式开发迈向企业级 AI 工程的分水岭。6. 与 Dify 等平台的协同效应值得注意的是OpenAI 兼容性带来的好处不仅限于 LangChain。主流低代码 AI 平台如Dify在其“自定义模型”设置中明确要求提供 OpenAI 兼容的 API 地址。这意味着你只需开发一次 LLM Gateway。它可同时服务于LangChain 编写的定制化 AgentDify 搭建的可视化工作流其他任何支持 OpenAI 协议的工具如 LlamaIndex、AutoGen这种跨平台复用能力极大降低了企业 AI 基础设施的维护成本。我的体会是一旦建立了符合 OpenAI 规范的 LLM Gateway整个组织的 AI 能力就具备了“即插即用”的灵活性。7. 实践建议与常见陷阱在实施 LLM Gateway 时需注意以下几点严格遵循 OpenAI 响应格式即使是微小的字段缺失如usage也可能导致 LangChain 解析异常。API Key 透传Gateway 应将客户端传入的Authorization: Bearer xxx头原样转发给后端模型如阿里百炼或根据内部策略映射。超时与重试在 Gateway 层实现合理的超时控制和重试机制避免单个模型故障拖垮整个系统。日志与监控记录每个请求的模型、token 消耗、延迟为成本优化和性能分析提供数据。笔者观察到许多团队初期尝试自研网关时往往低估了协议兼容的细节要求。建议直接参考 OpenAI 官方文档或开源项目如 LiteLLM的实现确保格式完全一致。8. 总结LLM Gateway 是企业 AI 的“中枢神经系统”LLM Gateway 并非炫技的架构而是应对现实复杂性的必然选择。它通过 OpenAI 兼容协议这一“通用语言”将异构模型整合为统一服务使 LangChain 等上层框架得以专注于业务逻辑而非基础设施。当你能在不重启服务的情况下切换主力模型当财务部门能清晰看到每个 AI 功能的成本构成当新入职的工程师无需学习五种 API 就能调用所有模型——你就真正拥有了一个可扩展、可维护、可进化的 AI 系统。这或许就是工程之美用简单的规则驾驭复杂的现实。