目录

API调用

一般流程:

示例:

使用OpenAI调用deepseek-r1

使用百度千帆平台调用deepseek-r1

调用自己训练的模型

Ollama:

将模型部署成本地服务

FastAPI vs vLLM 

👉更灵活,选择FastAPI

👉提高推理速度/大数据集推理,优先vLLM(并行处理)

直接使用vLLM框架

Ms-Swift + 集成vLLM推理框架


API调用

调用大模型API是指:直接使用编程方式调用第三方提供(无需本地部署大模型)大模型服务或者自己训练好的模型的服务,通过网络请求获取模型生成的结果。

优点:

  1. 无需本地部署大模型,无需硬件资源要求,无需关注模型训练,只需要按次数付费。
  2. 可以实现循环、定时等自动化任务。

一般流程:

API密钥(身份验证) - 构造请求内容 - 发送请求 - 解析响应结果

示例:

不同的平台调用方式和返回结果可能不一样,参考api文档就好。


  • 使用OpenAI调用deepseek-r1

  import OpenAI导入的是 OpenAI 开发的 Python SDK(软件开发工具包),本质是一套封装好的 HTTP 请求工具,方便开发者调用符合其规范的 API

from openai import OpenAI

# 1. 设置API密钥

client = OpenAI(
    api_key="xxx-xxx-xxx-xxx", 
    base_url="https://<第三方域名>/v1",   #指向的是第三方平台(兼容 OpenAI 路径)
    timeout=1800,    # 深度思考模型耗费时间会较长,建议设置一个较长的超时时间,推荐为30分钟
)

# 2. 调用模型
def ds_infer(prompt):

    response = client.chat.completions.create(
        model="deepseek-r1-xxxx",  # 替换 <Model> 为模型的Model ID
        messages=[
            {
                "role": "user", 
                "content": prompt
            }
        ],
        max_tokens=1024,
        temperature=0.0,
    )

    # CoT:思考过程
    # think = ''
    # if hasattr(response.choices[0].message, 'reasoning_content'):
    #     think += response.choices[0].message.reasoning_content
    #     think = '<think>\n' + think + '</think>\n'

    answer = response.choices[0].message.content
    return answer

# 3. 测试调用
result = ds_infer("解释什么是API")
print(result)
  • 使用百度千帆平台调用deepseek-r1

       先在百度智能云控制台创建一个APIKey,

       API参考链接:文本生成 - 千帆AI应用开发者中心-API参考qianfan-api | 百度智能云文档

import requests
import json

def main():
    url = "https://qianfan.baidubce.com/v2/chat/completions"  #文本生成任务,不同的生成任务不一样

    payload = json.dumps({
        "model": "deepseek-r1",   #模型名称
        "messages": [
            {
                "role": "system",
                "content": "You are a helpful assistant."
            },
            {
                "role": "user",
                "content": "你好,你是谁"    #prompt
            }
        ]
    })
    headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer bce-v3/ALTAK-*********/614fb**********'   #Bearer APIKey
    }

    response = requests.request("POST", url, headers=headers, data=payload)

    print(response.text)


if __name__ == '__main__':
    main()
  • 调用自己训练的模型

    • 详见下一节部署成本地服务并调用
  • Ollama:

        一款轻量工具,可在本地快速下载和运行开源大模型(如 Llama 3、Mistral、Qwen 等)。

  • 安装 Ollama

  • 下载模型直接进行交互
    • 打开 PyCharm 的终端(Terminal)或系统命令行,执行以下命令:

      • 首次运行会自动下载模型(需联网,大小约 3-10GB 不等)。
      • 下载完成后直接进入交互模式,可直接输入问题测试。
 D:\project_auto_ad\RL>ollama run qwen2.5
pulling manifest
pulling 2bada8a74506: 100% ▕█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 4.7 GB
pulling 66b9ea09bd5b: 100% ▕█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏   68 B
pulling eb4402837c78: 100% ▕█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 1.5 KB
pulling 832dd9e00a68: 100% ▕█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  11 KB
pulling 2f15b3218f05: 100% ▕█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  487 B
pulling 2f15b3218f05: 100% ▕█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  487 B
verifying sha256 digest
writing manifest
success
>>> 你是谁?明天气温多少
我是Qwen,由阿里云开发的AI助手。关于明天气温的问题,由于我无法实时获取最新的气象信息,请您查阅可靠的气象预报来源以获得准确的天气情况。您可以查询本地气象站或使用相关 weather APP 来    
获取最准确的信息。希望我的回答对您有所帮助!


#####################下载地址#############################

"C:\Users\80554\.ollama\models\manifests\registry.ollama.ai\library\qwen2.5"
  • 直接调用本地Ollama模型(已经下载到本地的)

    Ollama 启动后会在本地创建 API 服务(默认地址:http://localhost:11434/api/chat),可通过 requests 调用:

import requests
import json

def call_ollama_local(prompt, model="qwen2.5"):
    url = "http://localhost:11434/api/chat"
    data = {
        "model": model,
        "messages": [{"role": "user", "content": prompt}],
        "stream": False  # 非流式返回
    }
    response = requests.post(url, json=data)
    if response.status_code == 200:
        return response.json()["message"]["content"]
    else:
        return f"调用失败:{response.text}"

# 测试本地模型
if __name__ == "__main__":
    result = call_ollama_local("你是谁?具体说一下")
    print(result)
    # 我是Qwen,一个由阿里云开发的语言模型助手。我能够回答问题、创作文字,比如写文章、写代码、写公文、写邮件、写剧本等等,还能表达观点,玩游戏。我的目标是帮助用户更高效地完成任务,获得更好的使用体验。如果您有任何问题或需要帮助,请随时告诉我!

    将模型部署成本地服务

    """
    将本地模型部署为服务(如 API 接口)确实能解决多进程重复加载模型的问题 ——
    模型只需加载一次,所有进程通过网络请求调用,既能节省显存,又能支持更高并发,
    整体效率会显著提升
    """

    FastAPI vs vLLM 

    FastAPI vs vLLM

    FastAPI 部署

    vLLM 部署

    优点

    • 灵活性高,可自定义预处理/后处理

    • 完整的Web生态(中间件、认证等)

    • 优秀的文档自动生成

    • 支持复杂业务逻辑

    • 极高的吞吐量(4-10倍提升)
    • 优化的KV缓存管理

    • 自动连续批处理

    • 内存效率极高

    缺点

    • 推理性能较低

    • 内存利用率差

    • 批处理需要手动实现

    • 灵活性受限

    • 预处理逻辑固定

    • 依赖特定模型架构

    👉更灵活,选择FastAPI

    可以对base_model+lora进行部署模型,推理是一条一条的推(推理性能不高)

    • 部署成服务
      from fastapi import FastAPI, HTTPException
      from pydantic import BaseModel  # 用于请求参数校验
      from transformers import AutoTokenizer, AutoModelForCausalLM
      import torch
      import uvicorn
      import asyncio
      from contextlib import asynccontextmanager
      
      
      # 模型管理
      class ModelManager:
          def __init__(self, model_path):
              self.tokenizer = AutoTokenizer.from_pretrained(model_path)
              self.model = AutoModelForCausalLM.from_pretrained(
                  model_path,
                  torch_dtype=torch.float16,
                  device_map="auto"
              )
              self.model.eval()
      
          def generate(self, prompt, max_length=512):
              inputs = self.tokenizer(prompt, return_tensors="pt").to(self.model.device)
              with torch.no_grad():
                  outputs = self.model.generate(
                      **inputs,
                      max_length=max_length,
                      temperature=0.7,
                      do_sample=temperature>0,
                      pad_token_id=self.tokenizer.eos_token_id
                  )
              return self.tokenizer.decode(outputs[0], skip_special_tokens=True)
      
      
      # 应用生命周期管理
      @asynccontextmanager
      async def lifespan(app: FastAPI):
          # 启动时加载模型
          model_path = "./merged_model"  # 修改为本地模型路径
          app.state.model_manager = ModelManager(model_path)
          yield
          # 关闭时清理
          if hasattr(app.state, 'model_manager'):
              del app.state.model_manager
      
      
      # 初始化FastAPI应用
      app = FastAPI(
          title="LLM推理服务",
          description="基于FastAPI的LLM模型部署服务",
          version="1.0.0",
          lifespan=lifespan
      )
      
      
      # 请求/响应模型
      class GenerationRequest(BaseModel):
          prompt: str 
          max_length: int = 512
          temperature: float = 0.7
      
      class GenerationResponse(BaseModel):
          generated_text: str
          inference_time: float
      
      
      # API端点/请求接口(POST请求)
      @app.post("/sft_v3_generate_campaign", response_model=GenerationResponse)   
      async def generate_text(request: GenerationRequest):
          try:
              import time
              start_time = time.time()
              
              result = app.state.model_manager.generate(
                  request.prompt,
                  max_length=request.max_length
              )
              
              inference_time = time.time() - start_time
              
              return GenerationResponse(
                  generated_text=result,
                  inference_time=inference_time
              )
          except Exception as e:
              raise HTTPException(status_code=500, detail=str(e))
      
      @app.get("/health")
      async def health_check():
          return {"status": "healthy", "model_loaded": hasattr(app.state, 'model_manager')}
      
      
      # 启动服务(在终端运行时执行)
      if __name__ == "__main__":
          
          # 启动服务:host=0.0.0.0允许局域网访问,port=8000为端口号
          uvicorn.run(app, host="0.0.0.0", port=8000, workers=1)  # workers=1避免模型重复加载
      
    • 调用本地服务
      import requests
      
      
      # 服务端API地址
      API_URL = "http://localhost:8000/sft_v3_generate_campaign"  #部署的本地模型接口
      
      def call_model(prompt):
          """
              调用模型API
              字段与部署服务的参数名要相同
          """
          
          try:
              payload = {
              "prompt": prompt,
              "max_length": 512,
              "temperature": 0.1,
              }
              response = requests.post(API_URL, json=payload, timeout=60)  # 设置超时
              response.raise_for_status()  # 检查请求是否成功
              result = response.json()
              return result.get("generated_text", "")
          except requests.RequestException as e:
              print(f"请求API出错: {str(e)}")
              return None
      
      # 测试调用
      if __name__ == "__main__":
          result = call_model("解释什么是API")
          print(result)

    👉提高推理速度/大数据集推理,优先vLLM(并行处理)

    vLLM只能部署合并好的模型,未合并的模型(如只包含增量权重的 LoRA 模型)无法直接部署。

    直接使用vLLM框架

    vllm 框架已经封装了所有底层逻辑(如模型加载、KV 缓存优化、PagedAttention 实现、API 服务启动等),用户只需通过命令行参数指定核心配置(模型路径、端口、硬件资源等)。

    python -m vllm.entrypoints.openai.api_server 是 vllm 提供的OpenAI 兼容 API 服务入口,通过命令行参数即可启动一个高性能的大模型服务,省去了手动编写 HTTP 接口、优化推理逻辑的工作。

    • 部署成服务
      # 可以使用.sh文件
      #!/bin/bash
      # model   本地合并的模型路径或 Hugging Face Hub 模型名称
      # served-model-name   服务的模型标识(调用时需指定,如 OpenAI 兼容接口中的 model 参数)
      # dtype   数据类型(float16/bfloat16/float32,默认 auto,优先用 float16 节省显存)
      
      # tensor-parallel-size    显卡/GPU数量(单卡设为1,多卡设为卡数,如2)
      # gpu-memory-utilization   GPU 显存利用率上限(0-1,默认 0.9,预留部分显存避免 OOM)
      # cpu-offload   启用 CPU 卸载(显存不足时将部分层放到 CPU,牺牲性能换显存)
      
      # max-num-batched-tokens   批处理的最大 token 数(影响吞吐量,默认 32768,根据显存调整)
      # max-num-seqs    最大并发序列数(默认 256,控制同时处理的请求数)
      # enable-paged-attention   启用 PagedAttention 优化(默认开启,vllm 高性能核心)
      
      # port 8000 \  # 服务端口
      # host 0.0.0.0  # 允许局域网访问
      # allow-Origin    跨域请求允许的源(如 * 允许所有源,用于前端调用)
      # api-key 设置 API 密钥(启用认证,需在请求头中携带 Authorization: Bearer <key>)
      
      # temperature 全局默认温度参数(0-1,控制生成随机性,可被请求参数覆盖)
      # max-token  全局默认最大生成 token 数(可被请求参数覆盖)
      
      
      python -m vllm.entrypoints.openai.api_server \
        --model /root/xxx/model-merged \
        --served-model-name sft_v0_model \
        --tensor-parallel-size 1 \
        --dtype float16 \
        --port 8000 \
        --host 0.0.0.0
    • 调用本地服务
      from openai import OpenAI
      
      
      client = OpenAI(
          base_url="http://localhost:8000/v1",  # vLLM 服务的 API 前缀
          api_key="dummy-key"  # vLLM 不校验 API Key,填任意值即可
      )
      
      def call_model(model_name, instruction):
          response = client.chat.completions.create(
              model=model_name,  # 替换为你的模型名称
              messages=[
                  {
                      "role": "user", 
                      "content": instruction
                      },
              ],
              max_tokens=512,
              temperature=0.0,
              # do_sample=False
          )
          response = response.choices[0].message.content
          return response

    Ms-Swift + 集成vLLM推理框架

    可以使用基于 ms-swift 框架(一个大模型微调部署工具)部署服务的 shell 命令,主要用于加载多个 LoRA 适配器并通过 vLLM 后端启动推理服务。

    1. Swift 负责 “上层统筹”:处理模型加载(包括 LoRA 权重合并)、服务启动、API 接口封装(兼容 OpenAI 格式)等流程。
    2. vLLM 负责 “底层推理”:当指定 --infer_backend vllm 时,Swift 会将模型推理的核心工作交给 vLLM 执行,而非使用 Swift 自带的基础推理逻辑。

    实现“便捷部署+高性能推理”的结合。

    • 部署:
    CUDA_VISIBLE_DEVICES=0 \
    swift deploy \
        --adapters lora1=./checkpoint-80 lora2=./checkpoint-124 \
        --model base_model_id_or_path \  #如果lora中指定的base_model不在本地模型库中,需要显式指定路径
        --infer_backend vllm \
        --temperature 0.0 \
        --max_new_tokens 512
    • 检查可用模型列表

    发送 GET 请求到 http://localhost:8000/v1/models,会返回服务支持的模型列表

    curl http://localhost:8000/v1/models
    

    示例结果:

    {"data":[{"id":"qwen2.5","object":"model","created":1758251320,"owned_by":"swift"},{"id":"lora1","object":"model","created":1758251320,"owned_by":"swift"},{"id":"lora2","object":"model","created":1758251320,"owned_by":"swift"}],"object":"list"}

    分别代表:基座模型(qwen2.5)基座模型+Lora1基座模型+Lora2

    • 使用openai库调用api
    from openai import OpenAI
    
    # 初始化客户端,指定服务地址
    client = OpenAI(
        base_url="http://localhost:8000/v1",  # 服务的 API 前缀
        api_key="dummy-key"  # Swift 服务通常不验证 API key,填任意值即可
    )
    
    # 调用对话接口(/v1/chat/completions)
    response = client.chat.completions.create(
        model="Qwen2.5-7B-Instruct",  # 选择models中的某一个需要的服务名称
        messages=[
            {"role": "user", "content": "你好,介绍一下自己"}  # 你的提问
        ],
        temperature=0.3,  # 与部署时的参数一致(可选,也可在此处覆盖)
        max_tokens=1024   # 生成的最大token数
    )
    
    # 打印结果
    print(response.choices[0].message.content)

    更多推荐