自学内容网 自学内容网

如何将本地模型服务不可用,自动切换调用线上模型?

环境:

qwen

DeepSeek

问题描述:

如何将本地模型服务不可用,自动切换调用线上模型?
在这里插入图片描述

解决方案:

将本地模型调用部分封装到 qw.py,线上模型调用部分封装到 zx.py,并且在主程序 zj.py 中优先调用本地模型,若本地模型不可用则自动切换调用线上模型。

下面方案:


1. qw.py — 本地模型调用模块

import requests
from loguru import logger
import time
from typing import Optional

LOCAL_MODEL_API = "http://192.168.1.9:11434/v1/chat/completions"

def summarize_with_local_model(text: str) -> Optional[str]:
    headers = {"Content-Type": "application/json"}
    payload = {
        "model": "qwen2.5-3bnsfwny",
        "messages": [{"role": "user", "content": text}],
        "max_tokens": 512,
        "temperature": 0.25,
        "stream": False
    }
    try:
        logger.info("调用本地大模型接口,准备发送请求")
        start_time = time.time()
        r = requests.post(LOCAL_MODEL_API, headers=headers, json=payload, timeout=10)
        r.raise_for_status()
        logger.info(f"接口响应状态码:{r.status_code},耗时:{time.time() - start_time:.2f}秒")
        resp_json = r.json()
        content = resp_json.get("choices", [{}])[0].get("message", {}).get("content")

        logger.info(f"模型返回内容长度:{len(content) if content else 0}")
        logger.info(f"模型返回具体内容:{content}")

        return content
    except requests.exceptions.Timeout:
        logger.error("调用本地大模型失败: 请求超时")
        return None
    except Exception as e:
        logger.error(f"调用本地大模型失败: {e}")
        return None

2. zx.py — 线上模型调用模块(示例)

假设线上 DeepSeek 模型接口类似,您需要根据实际接口调整:

import os
from openai import OpenAI
from loguru import logger
from typing import Optional

client = OpenAI(
    api_key="your_real_api_key",
    base_url="https://ark.cn-beijing.volces.com/api/v3",
)

def summarize_with_online_model(text: str) -> Optional[str]:
    """
    调用线上DeepSeek的chat completion接口,非流式调用,
    返回模型文本内容,异常时返回None。
    """
    try:
        logger.info("调用线上DeepSeek模型接口,准备发送请求")
        # 构造消息列表,您可以根据实际需求调整system prompt等
        messages = [
            {"role": "system", "content": "你是人工智能助手"},
            {"role": "user", "content": text},
        ]
        completion = client.chat.completions.create(
            model="ep-20250602174215-fw5hx",
            messages=messages,
            stream=False
        )
        content = completion.choices[0].message.content
        logger.info(f"线上模型返回内容长度:{len(content) if content else 0}")
        logger.info(f"线上模型返回内容:{content}")
        return content
    except Exception as e:
        logger.error(f"调用线上模型失败: {e}")
        return None


3. zj.py — 主逻辑,自动切换调用

from loguru import logger
from typing import Optional

import qw  # 本地模型
import zx  # 线上模型

def summarize(text: str) -> Optional[str]:
    # 优先调用本地模型
    logger.info("优先尝试调用本地模型")
    result = qw.summarize_with_local_model(text)
    if result:
        logger.info("本地模型调用成功,返回结果")
        return result
    else:
        logger.warning("本地模型不可用,切换调用线上模型")
        result_online = zx.summarize_with_online_model(text)
        if result_online:
            logger.info("线上模型调用成功,返回结果")
            return result_online
        else:
            logger.error("线上模型调用也失败,无法获取结果")
            return None


# 下面是使用示例
if __name__ == "__main__":
    test_text = "请告诉我今天北京的天气。"
    answer = summarize(test_text)
    if answer:
        print("模型回答:", answer)
    else:
        print("未能获取模型回答,请稍后重试。")

总结

  • 本地模型调用代码放 qw.py 里,包含请求和异常处理;
  • 线上模型调用代码放 zx.py,类似结构,替换接口地址和认证信息;
  • 主程序 zj.py 负责调用本地模型,失败时自动切换调用线上模型;
  • 方便维护,且切换逻辑集中管理。


原文地址:https://blog.csdn.net/weixin_42672685/article/details/148653005

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!