Python 调用大语言模型

作者:user 发布日期:2026年4月16日 21:27 浏览量:25

一、通过环境变量来隐藏明文 APIKEY

  • 将 APIKEY 暴露在代码中是不合理的
  • 可以通过环境变量:OPENAI_API_KEY 和 DASHSCOPE_API_KEY 记录值,代码会自动读取变量从而获取值
  • Windows系统通过在用户环境变量配置添加实现
  • Mac系统在终端内修改 .zshrc 文件添加环境变量
    export OPENAI_API_KEY=xxx
    export DASHSCOPE_API_KEY=xxx
  • 配置完成后,重启 PyCharm 生效(如不生效可以重启电脑)

二、Ollama 部署本地大模型

1、Ollama 简介

  • 为了避免在线的大模型无法使用,基于 Ollama 部署本地模型,供代码调用。
  • Ollama 是一款旨在简化大语言模型本地部署和运行过程的开源软件:
    ollama 提供了一个轻量级、易于扩展的框架,让开发者能够在本地机器上轻松构建和管理 LLMs(大语言模型)
    通过 ollama,开发者可以导入和定制自己的模型,无需关注复杂的底层代码实现细节
  • 网站地址:https://ollama.com

2、Windows / Mac 系统部署 Ollama

  • Ollama 的部署还是很简单的,只需要进入官网点击 Download 按钮下载安装。
  • 安装完成后,通过命令如下命令,即可运行对应的模型,并在命令行内做交互。
ollama run 模型名称
  • 参数量选择:(参数量越大对硬件的要求越高,如果硬件能力不足,模型运算和吐字速度会下降)
    集成显卡:1.5b左右
    4G独显:8b以内
    8G独显:14b以内

3、代码调用 Ollama 的本地模型

  • 使用代码调用 Ollama 的本地模型还是很简单的,只需要将原有的代码进行简单改动即可
from openai import OpenAI
from config.config import DEEPSEEK_API_KEY,DEEPSEEK_BASE_URL

client = OpenAI(api_key=DEEPSEEK_API_KEY, base_url=DEEPSEEK_BASE_URL)

response = client.chat.completions.create(
    model="deepseek-reasoner",   # "deepseek-reasoner",  # "deepseek-chat",
    messages=[
        {"role": "system", "content": "You are a helpful assistant"},
        {"role": "user", "content": "你是谁?"},
    ],
    stream=False
)

print(response.choices[0].message.content)
  • 将 base_url 改为:http://localhost:11434/v1
  • 本地不需要使用 api_key
  • 将 model 改为对应的本地模型名称,如:qwen3:4b
from openai import OpenAI

client = OpenAI(base_url="http://localhost:11434/v1")

response = client.chat.completions.create(
    model="qwen3:4b",   # "deepseek-reasoner",  # "deepseek-chat",
    messages=[
        {"role": "system", "content": "You are a helpful assistant"},
        {"role": "user", "content": "你是谁?"},
    ],
    stream=False
)

print(response.choices[0].message.content)

三、OpenAI 库的基础使用

1、openai 库的基础使用

  • OpenAI 库是 OpenAI 官方推出的 Python SDK,核心作用是让开发者能简单、高效地调用 OpenAI 的各类 API(如:GPT聊天、DALL·E绘图、语音转文字等),无需手动处理 HTTP 请求、身份验证等底层细节。
  • 由于其发布较早且比较易用,现如今许多模型服务商均兼容 OpenAI SDK 的调用。
  • 流程:获取客户端对象 => 调用模型 => 处理结果

获取客户端对象:
- 主要是用以下2个参数:
api_key:模型服务商提供的 APIKEY 秘钥
base_url:模型服务商的 API 接入地址(主要基于此参数切换不同模型服务商,如:OpenAI、阿里云、腾讯云等)
- 示例:

from openai import OpenAI

client = OpenAI(api_key="your api key", base_url="服务商 BaseUrl")

调用模型:
- 通过 client.chat.completions.create 创建 ChatCompletion 对象
- 主要参数有2个:
model:选择所用模型,如:deepseek-chat、deepseek-reasoner、qwen3:4b
messages:提供给模型的消息
类型:list,可以包含多个字典消息
每个字典消息包含2个key,分别是:role(角色)和 content(内容)
- system 角色:设定助手的整体行为、角色和规则,为对话提供上下文框架(如指定助手身份、回答风格、核心需求),是全局的背景设定,影响后续所有交互
- assistant 角色:代表 AI 助手的回答,可以在代码中认为设定
- user 角色:代表用户,发送问题、指令或需求
- 示例:

from openai.types.chat.chat_completion import ChatCompletion

response: ChatCompletion = client.chat.completions.create(
    model = "deepseek-chat",
    messages = [
        { "role": "system", "content": "你是一个 Python 编程专家,并且不说废话简单回答。" },
        { "role": "assistant", "content": "我是一个 Python 编程专家,请问有什么可以帮您的吗?" },
        { "role": "user", "content": "获取当前时间" },
    ]
)

处理结果:
- 可以通过 print(response.choices[0].message.content) 输出模型给出的回答信息
- 示例:

{
  "id": "46dffd30-26ce-4244-96f1-91c196921fe9",
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "logprobs": null,
      "message": {
        "content": "你好!我是DeepSeek,由深度求索公司创造的AI助手。😊\n\n我是一个纯文本 档等。虽然我不支持多模态识别,但我具有文件上传功能,可以读取和处理图像、txt、pdf、ppt、word、excel等文件中的文字信息。\n\n我完全免费使用,拥有128K的上下文长度,还支持联网搜索功能(需要你在Web/App中手动点开联网搜索按键)。你也可以",
        "role": "assistant",
        "annotations": null,
        "audio": null,
        "function_call": null,
        "tool_calls": null,
        "reasoning_content": "啊这,用户问我是谁,这是很常见的开场问题。需要简单清晰地介绍自己的身份和功能,避免复杂描述。\n\n可以用公司背景和核心能力作为开头,让用户快速建尾加上表情符号显得更亲切。"
      }
    }
  ],
  "created": 1776323466,
  "model": "deepseek-reasoner",
  "object": "chat.completion",
  "service_tier": null,
  "system_fingerprint": "fp_eaab8d114b_prod0820_fp8_kvcache_new_kvcache_20260410",
  "usage": {
    "completion_tokens": 218,
    "prompt_tokens": 11,
    "total_tokens": 229,
    "completion_tokens_details": {
      "accepted_prediction_tokens": null,
      "audio_tokens": null,
      "reasoning_tokens": 80,
      "rejected_prediction_tokens": null
    },
    "prompt_tokens_details": {
      "audio_tokens": null,
      "cached_tokens": 0
    },
    "prompt_cache_hit_tokens": 0,
    "prompt_cache_miss_tokens": 11
  }
}

2、openai 库的流式输出

  • 可以通过设定结果输出为 stream 模式进行流式输出,获得更好的使用体验。
  • 开启流式输出主要就2步:
    在 client.chat.completions.create() 调用模型的时候设定参数:stream = True
    for 循环 response 对象,并在循环内输出内容
  • 示例:
from openai import OpenAI
from config.config import DEEPSEEK_API_KEY,DEEPSEEK_BASE_URL

client = OpenAI(api_key=DEEPSEEK_API_KEY, base_url=DEEPSEEK_BASE_URL)

response = client.chat.completions.create(
    model="deepseek-reasoner",   # "deepseek-reasoner",  # "deepseek-chat",
    messages=[
        {"role": "system", "content": "你是一个 Python 编程专家。"},
        {"role": "assistant", "content": "我是一个 Python 编程专家,请问有什么可以帮您的吗?"},
        {"role": "user", "content": "进行Python介绍"},
    ],
    stream=True  # 开启流式输出
)

"""
    end="":Python 的 print() 函数默认会在输出内容的末尾添加一个换行符 \n。
        设置为 "" 的作用:将结尾字符改为空字符串。这意味着打印完内容后,不换行,光标停留在当前行的末尾。
    flush=True:为了提高效率,Python 通常不会每打印一个字符就立即写入屏幕(标准输出),而是先将内容存入一个缓冲区(Buffer)。当缓冲区满了,或者程序结束、遇到换行符时,才一次性把缓冲区的内容显示出来。
        设置为 True 的作用:强制刷新缓冲区。这意味着 print() 执行后,内容会立即显示在终端屏幕上,不再等待缓冲区填满。
"""

for chunk in response:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

# print(response.choices[0].message.content)

3、openai 库附带历史消息调用模型

  • 调用模型传入的参数 messages,其要求是 list 对象,即表明其支持非常多的消息在内。我们可以基于此,将历史消息填入,让模型知晓对话的上下文,更好的回答。
  • 我们可以在调用模型的时候,通过在 messages 的 list 内,组织历史消息提供给模型。
已经是最后一篇了!