LLM 是什么?

LLM(Large Language Model)= 大语言模型,就是 ChatGPT、DeepSeek、MiMo 这类 AI 背后的技术。

它能做什么: 理解自然语言,生成文本回答。你问它"解释列表推导式",它能给你写一段解释。

我们怎么用它: 通过 API 调用。这和你 Day 6 调天气 API 的流程完全一样——发请求,拿响应,解析数据。

天气 API:发城市名 → 拿到天气 JSON
LLM API:发 prompt → 拿到回答 JSON

第 1 步:调通第一个 LLM API

环境准备

pip install openai

配置 .env

LLM_API_KEY=你的MiMo API Key
LLM_BASE_URL=https://api.xiaomimimo.com/v1

最小示例

from openai import OpenAI
import os
from dotenv import load_dotenv

load_dotenv()

client = OpenAI(
    api_key=os.getenv("LLM_API_KEY"),
    base_url=os.getenv("LLM_BASE_URL")
)

response = client.chat.completions.create(
    model="mimo-v2.5-pro",
    messages=[
        {"role": "user", "content": "你好,用一句话介绍你自己"}
    ]
)

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

代码逐行解释

代码 含义
from openai import OpenAI 导入 OpenAI SDK(MiMo 兼容 OpenAI 格式)
load_dotenv() 从 .env 读取 API Key 和 Base URL
client = OpenAI(...) 创建客户端,相当于 Day 6 的 httpx.AsyncClient
client.chat.completions.create(...) 发送对话请求(相当于 Day 6 的 requests.get()
model="mimo-v2.5-pro" 指定用哪个模型
messages=[...] 发给大模型的消息列表(Prompt)
response.choices[0].message.content 大模型回复的文本内容

第 2 步:Prompt Engineering 基础

Prompt = 你发给大模型的"指令"。

同样的模型,不同的 prompt 会得到完全不同的结果。

messages 的结构

messages = [
    {"role": "system",    "content": "你是Python老师,回答简洁"},    # 系统设定
    {"role": "user",      "content": "什么是列表推导式?"}           # 用户提问
]

role 有三种

role 谁说的 用途
system 系统设定 给大模型定"人设",它会一直遵守
user 用户(你) 你发的每一条消息
assistant 大模型 大模型回复的内容(通常 API 自动返回)

对话流程

system: "你是Python老师"
user: "什么是列表推导式?"
→ 大模型生成 assistant 回复
user: "给个例子"
→ 大模型看到之前的上下文,生成新的回复

第 3 步:Few-shot 提示

Few-shot = 在 prompt 里给几个"示例",让大模型照着学。

MiMo 的写法(示例写在 system 里)

messages = [
    {"role": "system", "content": """你是Python老师,回答简洁。

示例:
问:什么是列表推导式?
答:列表推导式是一行创建列表的语法,如 [x*2 for x in range(5)]

问:什么是生成器?
答:生成器是用 yield 逐个产出值的函数,省内存"""},

    {"role": "user", "content": "什么是装饰器?"}
]

OpenAI 的写法(用 assistant role)

messages = [
    {"role": "system", "content": "你是Python老师,回答简洁"},
    {"role": "user",      "content": "什么是列表推导式?"},
    {"role": "assistant", "content": "列表推导式是一行创建列表的语法"},
    {"role": "user",      "content": "什么是装饰器?"}
]

⚠️ MiMo 不支持 assistant role,只能用第一种写法。

Zero-shot vs Few-shot

类型 写法 效果
Zero-shot 直接问,不给例子 回答风格不确定
Few-shot 给 2-3 个示例再问 回答风格和示例一致

第 4 步:Token 概念

Token = 大模型处理文本的最小单位(不完全等于"字")。

"你好世界" → 约 4-6 个 token
"Hello world" → 约 2 个 token

为什么要知道这个? 因为 API 按 Token 收费——prompt 越长,token 越多,费用越高。


第 5 步:交互式 AI 聊天程序

"""
Day 11 最终项目:交互式 AI 聊天程序
输入 q 退出
"""
from openai import OpenAI
import os
from dotenv import load_dotenv

load_dotenv()

client = OpenAI(
    api_key=os.getenv("LLM_API_KEY"),
    base_url=os.getenv("LLM_BASE_URL")
)

# ── 初始消息(system 设定 + few-shot 示例) ──
messages = [
    {"role": "system", "content": """你是Python老师,回答简洁,用中文。

示例:
问:什么是列表推导式?
答:列表推导式是一行创建列表的语法,如 [x*2 for x in range(5)]

问:什么是yield?
答:yield 让函数暂停并产出值,下次调用从暂停处继续"""},
]

print("AI 聊天助手(输入 q 退出)")
print("=" * 40)

# ── 主循环 ──
while True:
    user_input = input("\n你:")

    if user_input == "q":
        print("再见!")
        break

    # 把用户输入加到消息列表
    messages.append({"role": "user", "content": user_input})

    # 调用 LLM API
    response = client.chat.completions.create(
        model="mimo-v2.5-pro",
        messages=messages
    )

    # 拿到回复
    reply = response.choices[0].message.content
    print(f"AI:{reply}")

    # 把回复也加到消息列表(保持上下文)
    messages.append({"role": "assistant", "content": reply})

用到的 Day 1-10 知识

代码 来源
while True + input() + if == "q": break Day 1-2 菜单循环
load_dotenv() / os.getenv() Day 6 .env 环境变量
client.chat.completions.create() Day 6 API 调用流程

你踩过的坑

坑 1:MiMo 的 base_url 填错

❌ api.mimo.xiaomi.com     (域名不存在)
✅ api.xiaomimimo.com      (正确)

教训: 别自己猜 URL,去看官方文档的示例代码。

坑 2:DNS 解析失败

httpx.ConnectError: [Errno 11001] getaddrinfo failed

原因: base_url 填错了,域名根本不存在。

坑 3:model 名字写错

❌ mimo-v2.5
✅ mimo-v2.5-pro

教训: 模型名必须和平台上的完全一致。

坑 4:MiMo 不支持 assistant role

openai.BadRequestError: messages[4] role is not supported

原因: MiMo 只支持 systemuser,不支持 assistant

解决: 把 Few-shot 示例写在 system 的 content 里。

坑 5:print 语法错误

print(response.choices[0].message.content)    # ✅
print(response,choices[0].message.content)    # ❌ 多了个逗号

概念速查表

概念 一句话理解
Prompt 你发给大模型的指令
System Prompt 给大模型定"人设"的规则
Few-shot 给几个示例让大模型照着学
Zero-shot 不给示例,直接问
Token 大模型处理文本的最小单位,按此收费
messages 对话历史列表,包含 system/user/assistant
base_url API 的请求地址
model 模型名称,必须和平台一致

一句话总结

LLM API 调用 = 和调天气 API 一样的流程:发请求 → 拿响应 → 解析数据。

Prompt Engineering 的核心:system 定人设,user 提问,Few-shot 给示例。

Day 1-5 的 while + input + if/break,在 AI 时代依然有用——交互式聊天就是这么写的。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐