RAG 学习第二课:从 0 理解 chat/completions 接口(看懂大模型到底怎么对话)
本节课目标:
彻底看懂一次最基础的大模型 API 调用。
你会明白:
为什么要调用
/chat/completionssystem prompt 到底是什么
messages 为什么是数组
temperature、max_tokens 有什么作用
返回结果为什么要一层层取
choices[0]["message"]["content"]RAG 后续为什么一定离不开这套结构
一、为什么这一课非常重要?
很多人在学习 RAG 的时候,直接开始:
-
向量数据库
-
embedding
-
chunk
-
rerank
-
agent
-
工作流
结果最后:
连最基础的大模型对话接口都没真正理解。
实际上:
RAG 的本质,最后还是:
把“检索出来的内容”塞进 prompt
再调用 chat/completions
所以:
如果你连 chat/completions 都没理解,后面很多知识都会变成“背概念”。
这一课,我们只做一件事:
把一次大模型对话 API 完全拆开。
二、本节课最终代码
下面这段代码,就是本节课最核心的内容。

import requests
def chat_completion(system_prompt, question):
resp = requests.post(
f"{BASE_URL}/chat/completions",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
},
json={
"model": CHAT_MODEL,
"messages": [
{
"role": "system",
"content": system_prompt
},
{
"role": "user",
"content": question
}
],
"temperature": 0.3,
"max_tokens": 1000
},
timeout=30
)
if resp.status_code != 200:
raise Exception(f"chat API 调用失败")
return resp.json()["choices"][0]["message"]["content"]
很多初学者看到这里会觉得:
这不就是 requests.post 吗?
但实际上:
这里面包含了整个 AI 应用开发的核心逻辑。
三、chat/completions 到底是什么?
这一句:
/chat/completions
是整个大模型“对话能力”的入口。
你可以理解成:
这是 AI 的聊天窗口
我们把消息发过去。
模型再把回答返回回来。
本质上:
它就是一个 HTTP 接口。
所以你会看到:
requests.post(...)
因为我们本质上是在:
向 AI 服务器发送一次 POST 请求。
四、BASE_URL 是什么?
代码:
f"{BASE_URL}/chat/completions"
这里的 BASE_URL:
通常是模型平台的地址。
比如:
https://api.openai.com/v1
或者:
https://dashscope.aliyuncs.com/compatible-mode/v1
再或者:
https://api.deepseek.com/v1
拼接后:
https://api.xxx.com/v1/chat/completions
这就是完整接口。
五、headers 为什么必须写?
代码:
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
这里面有两个关键内容。
1)Authorization
"Authorization": f"Bearer {API_KEY}"
这是:
身份认证。
你可以理解成:
登录 AI 平台的钥匙
没有 API_KEY:
服务器根本不知道你是谁。
所以:
很多新手第一次调用失败:
其实不是代码问题。
而是:
API_KEY 错了。
2)Content-Type
"Content-Type": "application/json"
这是告诉服务器:
我发送的数据是 JSON 格式
否则:
服务器可能无法正确解析。
这是 HTTP 请求中的标准写法。
六、json 参数才是真正的核心
这一段:
json={
...
}
才是真正决定:
AI 如何思考。
里面每个字段都非常重要。
七、model 是什么?
代码:
"model": CHAT_MODEL
这里指定:
你要调用哪个模型。
例如:
"gpt-4o-mini"
或者:
"deepseek-chat"
或者:
"qwen-max"
不同模型:
-
能力不同
-
价格不同
-
速度不同
-
上下文长度不同
所以:
model 本质上是:
选择 AI 大脑。
八、messages 才是灵魂
代码:
"messages": [
{
"role": "system",
"content": system_prompt
},
{
"role": "user",
"content": question
}
]
很多人学 AI 最大的问题:
就是只会写 prompt。
但不知道:
为什么 prompt 要放在 messages 里面。
九、为什么 messages 是数组?
因为:
大模型本质上是“多轮对话”。
例如:
用户:你好
AI:你好
用户:帮我写 Python
AI:好的
其实会变成:
messages = [
{"role": "user", "content": "你好"},
{"role": "assistant", "content": "你好"},
{"role": "user", "content": "帮我写 Python"}
]
模型会读取:
整个历史对话。
所以:
messages 必须是数组。
因为里面会不断追加聊天记录。
十、role 到底是什么意思?
每条消息都必须有:
role
因为模型需要知道:
这句话是谁说的。
目前最常见的有三种角色:
| role | 含义 |
|---|---|
| system | 系统身份设定 |
| user | 用户输入 |
| assistant | AI 回复 |
十一、system prompt 是什么?
代码:
{
"role": "system",
"content": system_prompt
}
这是整个 AI 应用开发里最重要的东西之一。
system prompt:
决定 AI 是谁。
比如:
你是一个资深 Python 专家
或者:
你是一个 RAG 架构师
或者:
你只能根据知识库回答
你会发现:
AI 的行为会完全改变。
所以:
很多 AI 项目:
真正的壁垒其实是:
prompt engineering
而不是代码。
十二、user role 是什么?
代码:
{
"role": "user",
"content": question
}
这里就是:
用户真正的问题。
例如:
"content": "请解释什么是 RAG"
模型会结合:
-
system prompt
-
user question
-
历史上下文
一起生成回答。
十三、temperature 是什么?
代码:
"temperature": 0.3
这是:
控制模型发散程度。
可以理解成:
AI 的随机性
temperature 越低
例如:
0.1
特点:
-
更稳定
-
更严谨
-
更像固定答案
-
更适合 RAG
-
更适合知识问答
temperature 越高
例如:
1.2
特点:
-
更有创造力
-
更发散
-
更容易胡说
-
更适合小说
-
更适合创意写作
为什么 RAG 通常 temperature 很低?
因为:
RAG 的目标是:
根据知识库准确回答。
不是让 AI 自由发挥。
所以:
通常会设置:
0.1 ~ 0.5
十四、max_tokens 是什么?
代码:
"max_tokens": 1000
这是:
最大生成长度。
很多人误以为:
token = 单词
其实不准确。
对于中文:
一个汉字通常也会占 token。
为什么必须限制?
因为:
token = 钱。
生成越长:
-
越贵
-
越慢
-
越容易跑偏
所以:
生产环境里:
必须控制 token。
十五、timeout 为什么重要?
代码:
timeout=30
意思是:
30 秒没返回就超时
为什么必须写?
因为:
AI 接口可能卡死。
如果不设置 timeout:
程序可能会一直等待。
这是生产环境里非常危险的。
十六、为什么要检查 status_code
代码:
if resp.status_code != 200:
raise Exception("chat API 调用失败")
因为:
并不是所有请求都会成功。
例如:
-
API_KEY 错误
-
余额不足
-
网络异常
-
请求太频繁
-
模型不存在
这时候:
服务器会返回错误码。
所以:
必须做异常处理。
这是很多新手最容易忽略的问题。
十七、最难理解的一行代码
代码:
resp.json()["choices"][0]["message"]["content"]
很多初学者看到这里直接懵。
但其实:
本质就是一层层取 JSON。
十八、AI 返回的数据结构到底长什么样?
实际上:
服务器返回的大概是:
{
"choices": [
{
"message": {
"content": "你好,我是 AI"
}
}
]
}
所以:
第一步
resp.json()
把响应转成 Python 字典。
第二步
["choices"]
取出:
choices
得到:
[
{
"message": {
"content": "你好,我是 AI"
}
}
]
这是一个列表。
第三步
[0]
取第一个回答。
因为:
有些模型可能一次返回多个候选答案。
所以:
choices 是数组。
第四步
["message"]
得到:
{
"content": "你好,我是 AI"
}
第五步
["content"]
最终得到:
"你好,我是 AI"
这才是真正的模型回复。
十九、这一课和 RAG 的关系
你现在看到的:
只是普通聊天。
但 RAG 会多一步:
先检索知识库
然后:
把检索结果拼接进 prompt
最后:
还是调用:
/chat/completions
例如:
system_prompt = f"""
你必须根据以下知识库回答:
{context}
"""
这就是:
RAG 的核心思想。
所以:
这一课其实是:
后面所有 AI 应用开发的基础。
二十、完整运行示例
下面给大家一个可以直接运行的版本。
import requests
BASE_URL = "https://api.openai.com/v1"
API_KEY = "你的API_KEY"
CHAT_MODEL = "gpt-4o-mini"
def chat_completion(system_prompt, question):
resp = requests.post(
f"{BASE_URL}/chat/completions",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
},
json={
"model": CHAT_MODEL,
"messages": [
{
"role": "system",
"content": system_prompt
},
{
"role": "user",
"content": question
}
],
"temperature": 0.3,
"max_tokens": 1000
},
timeout=30
)
if resp.status_code != 200:
raise Exception(resp.text)
return resp.json()["choices"][0]["message"]["content"]
answer = chat_completion(
"你是一个 Python 专家",
"请解释什么是 RAG"
)
print(answer)
二十一、本节课你必须真正理解的内容
不要死记代码。
真正要理解的是:
| 模块 | 本质 |
|---|---|
| chat/completions | AI 对话入口 |
| system prompt | AI 身份设定 |
| user | 用户问题 |
| messages | 历史上下文 |
| temperature | 随机性控制 |
| max_tokens | 输出长度控制 |
| choices | 模型候选答案 |
当你真正理解这些以后:
你会发现:
RAG、Agent、工作流、本地知识库,本质上都是在“操控 prompt”。
二十二、下一课预告
下一节课我们会正式进入:
RAG 的第一步:Embedding
你会真正理解:
-
为什么文本可以变成向量
-
embedding 到底是什么
-
为什么向量能表示语义
-
相似度搜索为什么能找到“意思相近”的内容
-
RAG 为什么离不开向量数据库
这是从“调用 AI”走向“构建 AI 系统”的真正开始。
最后
如果这篇文章对你有帮助,欢迎:点赞、收藏、关注
后面会继续更新:
-
RAG 全流程
-
向量数据库
-
Agent
-
LangChain
-
LangGraph
-
MCP
-
AI 工作流
-
本地知识库
-
企业级 RAG 架构
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)