慕雪的小助手正在绞尽脑汁···
慕雪小助手的总结
DeepSeek & LongCat

欢迎阅读慕雪撰写的AI Agent专栏,本专栏目录如下

  1. 【AI】AI对26届计算机校招的影响
  2. 【Agent.01】AI Agent智能体开发专题引言
  3. 【Agent.02】市面上常见的大模型有哪些?
  4. 【Agent.03】带你学会写一个基础的Prompt
  5. 【Agent.04】AI时代的hello world:调用OpenAI接口,与大模型交互

本文介绍了如何使用python发送请求,调用OpenAI的API,与大模型交互,获取到大模型关于hello的响应。

1. 引言

如果说学习编程的第一个程序是hello world,那么学习AI Agent开发的第一个程序就是调用AI API。就像学车要先认识方向盘一样,调用API也是AI开发的必备技能。

本文将介绍如何使用Python的requests库调用硅基流动的OpenAI兼容API。这其实就是一个HTTP请求的事,我们发送请求给OpenAI格式API接口的服务端,服务端将请求处理成大模型能够接受的入参,再把大模型返回的结果,以OpenAI API的格式返回给我们。

本文使用Python的requests库,以硅基流动的API做示例,请求Qwen/Qwen3-8B模型。OpenAI的请求格式可以参考硅基流动的OpenAI API文档

阅读本文之前,请确保你对HTTP协议、Python的基本语法和requests库的使用有一定了解。本站的Agent专题不包含Python教学部分。

2. 准备工作

2.1. 获取API密钥

首先需要注册硅基流动账号,地址:https://cloud.siliconflow.cn/

如果你愿意支持慕雪,可以使用慕雪的邀请链接注册硅基流动,万分感谢!

登录后,在控制台找到"API Keys"页面,创建新的API密钥。这个密钥就是你在硅基流动这个平台上的身份证,千万保管好,别泄露了。任何平台的API Key都必须保管好!

2.2. 安装依赖库

首先需要保证你的电脑上有Python的基本环境,安装Python参考本站博客:点我。建议至少安装Python 3.10.x版本,不要安装太老的版本。

我们需要使用Python的requests库发送HTTP请求,所以需要安装requests库:

1
pip3 install requests

requests这玩意非常常用,所以直接装在你python全局环境就OJBK了,刚开始学习的时候,没必要去折腾啥虚拟环境。

3. 开始调用!

3.1. 基础调用示例

下面是一个最最最基础的OpenAI请求,包含了一个system prompt和我们咨询的问题。

使用这个代码之前,你需要先替换代码最后的API_KEY为你自己的硅基流动API Key。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import requests
import json

def call_ai_api(api_key, question):
"""
调用硅基流动的OpenAI兼容API

Args:
api_key: API密钥
question: 用户问题

Returns:
API响应结果
"""
url = "https://api.siliconflow.cn/v1/chat/completions"

headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}

data = {
"model": "Qwen/Qwen3-8B",
"messages": [
{"role": "system", "content": "你是一个有帮助的AI助手,回答要简明扼要。"},
{"role": "user", "content": question}
],
"stream": False,
"max_tokens": 512,
"temperature": 0.7,
"top_p": 0.7
}

response = requests.post(url, headers=headers, json=data)

if response.status_code == 200:
return response.json()
else:
return {"error": f"请求失败,状态码: {response.status_code}", "message": response.text}

# 使用示例
if __name__ == "__main__":
API_KEY = "your_api_key_here" # 替换为实际API密钥
result = call_ai_api(API_KEY, "Hello World在编程中的意义是什么?")

if "error" in result:
print(f"请求出错: {result['error']}")
else:
print(f"AI回复: {result['choices'][0]['message']['content']}")

运行结果如下,AI成功回答了我们的问题

1
2
3
4
5
6
7
8
9
10
❯ uv run basic/01.openai_hello_world.py 
AI回复:

"Hello World"是编程学习的入门示例,主要用于:
1. **验证环境**:确认编程语言和开发工具配置正确。
2. **教学用途**:帮助初学者快速理解基本语法结构(如输出语句)。
3. **历史传统**:源自1970年代C语言的早期教程,现已成为编程界的通用"Hello World"惯例。
4. **调试起点**:作为程序运行的简单测试,确保代码执行无误。

它象征着编程学习的起点,强调“能运行即可”的核心目标。

3.2. 关键参数说明

接下来,对OpenAI API接口中的关键参数进行说明。

3.2.1. Header

首先是header里面的字段,Authorization是一个比较通用的鉴权字段,这里传入了我们的API KEY用来确认我们的用户身份,服务器才能提供响应。后续调用收费的模型,也会自动定位到你的硅基流动账户,进行扣费。

简单来说,Authorization就是一个身份标识,好比进门的钥匙。毕竟你不能不带钥匙就去开门,如果谁来都开门了,这个OpenAI的API接口岂不是能随便请求,那肯定会被干爆的!

1
2
3
4
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}

3.2.2. Body

随后,再来看看OpenAI的body字段里面有哪些内容

1
2
3
4
5
6
7
8
9
10
data = {
"model": "Qwen/Qwen3-8B",
"messages": [
{"role": "system", "content": "你是一个有帮助的AI助手,回答要简明扼要。"},
{"role": "user", "content": question}
],
"stream": False,
"max_tokens": 512,
"temperature": 0.7
}

这个body里面包含的字段如下:

  1. model:选择使用的AI模型,硅基流动提供多种模型可选
  2. messages:对话历史,包含角色和内容
  3. stream:是否使用流式响应,False表示等待完整响应,True代表使用流失响应;
  4. max_tokens:限制响应的最大token数量,防止AI输出到一半就不干活了,或者输出太多"跑火车";
  5. temperature:控制回答的随机性,0到1之间的小数,值越高回答越有创意,或者说越高就越偏离你的原定目标。如果想让AI别那么发散,就把这个值稍微调小一点。一般建议默认使用0.7

3.2.3. Messages列表

其中,最重要的参数,是messages列表,这个列表控制了我们的历史记录。我们每次对大模型的请求,都是无状态的,整个对话的输入输出,都是客户端在控制。

举个例子:

  • 你请求了大模型A,咨询了问题1234。
  • 你使用相同的历史记录去请求大模型B,大模型B依旧会有这些历史记录的“记忆”,继续回答你的问题5,同时也会知道前4个问题是啥。

所以,在编写一个多次对话的大模型请求的时候,我们作为客户端的代码需要主动维护这个历史消息的messages列表,保证已有对话的记忆不丢失。

messages列表中的每一个成员都是一个dict,包含两个字段:

  • role:字符串类型。当前这条消息的身份,可选值为system、user、assistant、tool,分别对应系统消息(system prompt)、用户发送的问题、大模型的回答、以及工具调用的返回值(工具调用结果)。
  • content:字符串或数组类型,当前这条消息的内容。建议不要使用数组类型,直接用字符串填写内容。

对应Json格式如下:

1
2
3
4
{
"role": "system | user | assistant | tool",
"content": "字符串内容"
}

当出现多轮对话的时候,我们请求体里面的messages列表也要对应更新,这便是我们客户端维护的历史消息。

1
2
3
4
5
6
7
[
{"role": "system", "content": "你是一名旅行顾问"},
{"role": "user", "content": "巴黎有哪些免费景点?"},
{"role": "assistant", "content": "巴黎免费景点有:塞纳河步行、卢森堡公园、蒙马特高地……"},
{"role": "user", "content": "那吃的呢?什么是最好吃的?"},
{"role": "assistant", "content": "法式牛排非常吃!"},
]

role中比较特殊的是tool这个类型,代表的是工具调用的返回结果。这部分在后续function calling实操部分再展开讲讲,现在你只要知道role有这个类型就行了。

3.3. 进阶:流式响应

如果需要实时查看AI的输出过程(类似ChatGPT网页端上的样子),可以使用流式响应:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import requests
import json

def stream_response(api_key, question):
url = "https://api.siliconflow.cn/v1/chat/completions"

headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}

data = {
"model": "Qwen/Qwen3-8B",
"messages": [
{"role": "user", "content": question}
],
"stream": True,
"max_tokens": 512
}

response = requests.post(url, headers=headers, json=data, stream=True)
# 这里返回200,并不是请求全都发回来了,而是连上服务器了!
if response.status_code == 200:
# 开始遍历返回的结果,判断是不是有数据
for line in response.iter_lines():
if line:
line_str = line.decode('utf-8')
if line_str.startswith('data:'):
if line_str == 'data: [DONE]':
break
json_str = line_str[5:]
chunk = json.loads(json_str)
# 真的有数据诶,打印一下!
if chunk['choices'][0]['delta'].get('content'):
print(chunk['choices'][0]['delta']['content'], end='', flush=True)
else:
print(f"请求失败,状态码: {response.status_code}")

# 使用示例
if __name__ == "__main__":
API_KEY = "your_api_key_here"
stream_response(API_KEY, "请写一首关于冬天的诗")

流式传输的执行效果如下

Sep-30-2025 16-35-28的副本.gif

不过,一般也只有开发前后端AI项目的时候需要用到流式相应。如果是开发一个自动化的Agent,没必要使用流式响应,对性能和效果都没有啥提升,反而会把代码变得复杂

4. 总结

调用OpenAI API是AI开发的入门技能,就像学习编程的hello world。掌握了这个基础,后续可以:

  1. 尝试不同模型,比较效果差异
  2. 将AI集成到实际项目中
  3. 探索更多AI应用场景

最后提醒:AI只是工具,关键是怎么用。与其追求最新最强的模型,不如先掌握好基本用法。

另外,本文介绍的OpenAI API请求只是最基础的一个hello world,Agent开发中并不会使用这么原始的方式调用OpenAI的接口,而是会使用OpenAI官方提供的python sdk和包装好的Agent框架,这样能避免造轮子的尴尬。这些都是后续专栏中会逐步介绍的内容了。