写在前面
2026年初,OpenAI悄悄推出了一个改变游戏规则的新接口:Responses API。如果你还在用chat.completions.create()写AI应用,这篇文章值得认真看完——Responses API不是小升级,它是OpenAI对"如何正确构建AI应用"的重新思考。
一、Responses API vs Chat Completions:核心区别
从"无状态"到"有状态"
Chat Completions API每次调用都是独立的,开发者必须自己维护对话历史,每次请求都把所有历史消息传过去。这会带来:
- 上下文窗口消耗大
- 对话历史管理复杂
- 多轮对话成本线性增长
Responses API引入了服务端会话管理:
from openai import OpenAI
client = OpenAI()
# 第一轮对话
response = client.responses.create(
model="gpt-4.1",
input="请介绍一下Transformer架构的核心原理"
)
print(response.output_text)
response_id = response.id # 保存这个ID
# 第二轮对话,只需传入上一次的response_id
response2 = client.responses.create(
model="gpt-4.1",
previous_response_id=response_id, # 关键!
input="它和RNN相比有什么优势?"
)
print(response2.output_text)
# 模型会记住上一轮关于Transformer的对话内容
OpenAI服务端自动维护对话状态,你只需要保存response.id。
内置工具调用(Built-in Tools)
Chat Completions需要开发者自己实现工具的执行逻辑,Responses API提供了OpenAI官方托管的工具:
response = client.responses.create(
model="gpt-4.1",
tools=[
{"type": "web_search_preview"}, # 实时网络搜索
{
"type": "file_search", # 文件/知识库搜索
"vector_store_ids": ["vs_abc123"]
},
{"type": "code_interpreter"} # 代码执行环境
],
input="分析一下最近一周的AI领域重大新闻,并用Python生成一个词频统计图"
)
这三个内置工具由OpenAI负责执行,结果自动回传给模型,开发者无需编写任何工具执行代码。
二、核心功能详解
2.1 Web Search(实时联网搜索)
response = client.responses.create(
model="gpt-4.1",
tools=[{
"type": "web_search_preview",
"search_context_size": "high" # low/medium/high,控制搜索深度
}],
input="2026年4月最新的大模型发布了哪些?给我详细信息"
)
# 响应中包含搜索结果引用
for item in response.output:
if item.type == "message":
print(item.content[0].text)
elif item.type == "web_search_call":
print(f"搜索查询:{item.query}")
# 获取引用来源
for annotation in response.output[-1].content[0].annotations:
if annotation.type == "url_citation":
print(f"来源:{annotation.url} - {annotation.title}")
2.2 File Search(向量知识库检索)
这个功能相当于内置了一个RAG系统:
# 第一步:创建向量存储并上传文件
vector_store = client.vector_stores.create(name="企业知识库")
# 批量上传文档
file_paths = ["product_manual.pdf", "faq.docx", "api_docs.md"]
file_streams = [open(path, "rb") for path in file_paths]
file_batch = client.vector_stores.file_batches.upload_and_poll(
vector_store_id=vector_store.id,
files=file_streams
)
print(f"上传状态:{file_batch.status}") # completed
# 第二步:使用File Search查询
response = client.responses.create(
model="gpt-4.1",
tools=[{
"type": "file_search",
"vector_store_ids": [vector_store.id],
"max_num_results": 10, # 最多返回10个相关片段
"ranking_options": {
"ranker": "auto",
"score_threshold": 0.3 # 相关性阈值
}
}],
input="我们的产品支持哪些支付方式?退款政策是什么?"
)
2.3 Code Interpreter(沙箱代码执行)
response = client.responses.create(
model="gpt-4.1",
tools=[{"type": "code_interpreter"}],
input="""
我有以下销售数据,请帮我:
1. 计算各月环比增长率
2. 找出增长最快的3个月
3. 生成一个折线图并保存为PNG
数据:月份=[1,2,3,4,5,6], 销售额=[100,120,115,140,160,180]
""",
)
# 下载生成的图片
for item in response.output:
if hasattr(item, "code"):
print(f"执行的代码:\n{item.code}")
if hasattr(item, "outputs"):
for output in item.outputs:
if output.type == "image":
# 下载图片
image_data = client.files.content(output.file_id)
with open("sales_chart.png", "wb") as f:
f.write(image_data.read())
print("图表已保存:sales_chart.png")
三、流式输出(Streaming)
# 流式输出,适合实时展示
with client.responses.stream(
model="gpt-4.1",
tools=[{"type": "web_search_preview"}],
input="解释一下量子计算对密码学的影响"
) as stream:
for event in stream:
# 文字输出事件
if event.type == "response.output_text.delta":
print(event.delta, end="", flush=True)
# 工具调用开始事件
elif event.type == "response.output_item.added":
if event.item.type == "web_search_call":
print(f"\n[正在搜索: {event.item.query}]")
# 流结束事件
elif event.type == "response.completed":
print(f"\n\n总token消耗: {event.response.usage.total_tokens}")
四、Computer Use(计算机控制)
这是Responses API最令人震惊的功能——让AI直接操控计算机:
import anthropic # Computer Use目前Claude更成熟,但OpenAI也在跟进
# 以OpenAI实现为例(beta阶段)
response = client.responses.create(
model="computer-use-preview",
tools=[{
"type": "computer_use_preview",
"display_width": 1920,
"display_height": 1080,
"environment": "browser"
}],
input="打开Gmail,找到最近3封关于'季度报告'的邮件,总结主要内容"
)
for item in response.output:
if item.type == "computer_call":
action = item.action
print(f"执行操作:{action.type}")
if action.type == "screenshot":
# 获取当前屏幕截图
pass
elif action.type == "click":
print(f"点击位置:({action.x}, {action.y})")
elif action.type == "type":
print(f"输入文字:{action.text}")
五、与Assistant API的区别
很多人会问:Responses API和之前的Assistants API有什么区别?
| 维度 | Assistants API | Responses API |
|---|---|---|
| 状态管理 | Thread/Run概念 | response_id链式引用 |
| 复杂度 | 较高(需管理Thread) | 较低(单一response对象) |
| 工具集成 | 支持自定义工具 | 内置工具+自定义工具 |
| 流式支持 | 支持 | 支持(更简洁) |
| 定价 | 按token | 按token |
| 状态存储 | OpenAI服务端(30天) | OpenAI服务端(可配置) |
结论:Responses API是Assistants API的进化版,更简洁、更强大。新项目建议直接用Responses API,老项目逐步迁移。
六、Function Calling在Responses API中的新写法
Responses API完全支持自定义工具调用,写法更清晰:
import json
# 定义工具
tools = [
{
"type": "function",
"name": "get_stock_price",
"description": "获取指定股票的实时价格",
"parameters": {
"type": "object",
"properties": {
"symbol": {
"type": "string",
"description": "股票代码,如 AAPL, GOOGL"
},
"currency": {
"type": "string",
"enum": ["USD", "CNY"],
"description": "货币单位"
}
},
"required": ["symbol"]
}
}
]
# 发起请求
response = client.responses.create(
model="gpt-4.1",
tools=tools,
input="苹果公司的股价现在是多少?"
)
# 处理工具调用
for item in response.output:
if item.type == "function_call":
function_name = item.name
arguments = json.loads(item.arguments)
print(f"调用函数: {function_name}")
print(f"参数: {arguments}")
# 执行实际的函数
if function_name == "get_stock_price":
price = fetch_stock_price(arguments["symbol"])
# 将工具结果传回
response2 = client.responses.create(
model="gpt-4.1",
previous_response_id=response.id,
input=[{
"type": "function_call_output",
"call_id": item.call_id,
"output": json.dumps({"price": price, "currency": "USD"})
}]
)
print(response2.output_text)
七、实战:构建企业级RAG+搜索问答系统
结合File Search和Web Search,10行核心代码搭建混合检索问答:
def create_hybrid_qa_system(vector_store_id: str):
"""创建混合知识库+实时搜索的问答系统"""
def ask(question: str, session_id: str | None = None) -> dict:
kwargs = {
"model": "gpt-4.1",
"tools": [
{
"type": "file_search",
"vector_store_ids": [vector_store_id]
},
{
"type": "web_search_preview",
"search_context_size": "medium"
}
],
"instructions": """
优先从知识库中查找答案。如果知识库中没有相关信息,
或者问题涉及最新动态,则使用网络搜索补充。
回答时标注信息来源(知识库 or 网络)。
""",
"input": question
}
if session_id:
kwargs["previous_response_id"] = session_id
response = client.responses.create(**kwargs)
return {
"answer": response.output_text,
"session_id": response.id,
"usage": response.usage.total_tokens
}
return ask
# 使用
qa = create_hybrid_qa_system("vs_your_store_id")
result1 = qa("我们产品的定价策略是什么?")
print(result1["answer"])
# 继续追问(保持上下文)
result2 = qa("和竞品相比如何?", session_id=result1["session_id"])
print(result2["answer"])
八、迁移指南:从Chat Completions迁移到Responses API
# 旧写法(Chat Completions)
conversation_history = []
def old_chat(user_message: str) -> str:
conversation_history.append({"role": "user", "content": user_message})
response = client.chat.completions.create(
model="gpt-4-turbo",
messages=conversation_history
)
assistant_message = response.choices[0].message.content
conversation_history.append({"role": "assistant", "content": assistant_message})
return assistant_message
# 新写法(Responses API)
last_response_id = None
def new_chat(user_message: str) -> str:
global last_response_id
kwargs = {"model": "gpt-4.1", "input": user_message}
if last_response_id:
kwargs["previous_response_id"] = last_response_id
response = client.responses.create(**kwargs)
last_response_id = response.id
return response.output_text
代码量减少约40%,且不再需要自己管理对话历史。
总结
Responses API代表了OpenAI对"正确的AI应用开发范式"的最新判断:
- 有状态对话取代无状态API调用
- 内置工具降低RAG、搜索、代码执行的集成门槛
- 更简洁的接口让开发者专注业务而非框架
- 向Computer Use延伸,打开AI自主执行任务的新空间
如果你正在构建新的AI应用,从Responses API起步将让你少走很多弯路。
本文基于OpenAI Responses API 2026年文档编写