需先确保各模型api或本地服务就绪且端口不冲突,再安装langchain-openai等指定依赖,配置对应密钥或model_id及device_map,用runnableparallel构建三路子链并适配消息格式,最后统一超时熔断与参数归一化。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

准备多模型调用环境
要在一次对话中同时调用多个大模型(如 GPT-4、Claude-3、Orion-14B-Chat-RAG),必须确保各模型的 API 或本地推理服务已独立就绪,且网络/端口不冲突。
安装基础依赖:运行 pip install -qU langchain-openai langchain-anthropic langchain-huggingface。注意不要装 langchain 全量包,避免版本冲突导致 RunnableParallel 初始化失败。
为每个模型单独配置认证密钥或模型路径:OpenAI 使用 OPENAI_API_KEY,Anthropic 使用 ANTHROPIC_API_KEY,HuggingFace 本地模型需指定 model_id="Orion-14B-Chat-RAG" 并加载 device_map="auto" —— 【若未设 device_map,14B 模型在单卡 24GB 显存下会 OOM 中断】。
构建并行调用链
使用 LangChain 的 RunnableParallel 组织多模型输入输出,而非手写 asyncio.gather —— 后者无法统一管理 prompt 模板与历史消息注入逻辑。
定义三个子链:
方法一:OpenAI 路径 → ChatOpenAI(model="gpt-4-turbo", temperature=0.3) + PromptTemplate.from_template("你作为技术架构师,请用中文回答:{input}");
方法二:Claude 路径 → ChatAnthropic(model="claude-3-haiku-20240307", max_tokens=1024) + 相同 PromptTemplate;
方法三:Orion 本地路径 → HuggingFacePipeline.from_model_id("Orion-14B-Chat-RAG", task="text-generation", pipeline_kwargs={"max_new_tokens": 512}),注意必须传入 pipeline_kwargs,否则默认只生成 20 token 导致回复截断。
注入多轮对话状态
第一步:将原始用户输入与最近 3 轮对话历史拼接为结构化消息列表,格式为 [{"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}];
第二步:对每条消息做角色映射适配 —— OpenAI 和 Claude 原生支持 role 字段,Orion 需预处理为 "{content}" 格式,否则模型无法识别对话轮次;
第三步:将适配后的消息列表分别喂入三个 Runnable 子链,触发并行推理;
第四步:收集返回结果,用 RunnablePassthrough.assign(final_answer=lambda x: [x["openai"], x["claude"], x["orion"]]) 封装成字典结构,保留各模型原始输出粒度,不强制合并。
处理参数冲突与超时熔断
不同模型对 temperature、max_tokens、stop 等参数语义不一致:GPT 系列 stop 是字符串列表,Claude stop 是单个字符串,Orion 不支持 stop 参数。必须在子链内部做参数归一化封装,不可直接透传。
设置统一超时:用 asyncio.wait_for(..., timeout=45.0) 包裹整个 RunnableParallel.invoke() 调用 —— 【超时值必须小于最慢模型平均响应时间的 1.5 倍,否则熔断失效】。
当任一模型报错(如 429、CUDA out of memory),其余模型结果仍有效,自动跳过错误项并记录日志,不中断整体流程。











