Appearance
第十一部分:模型 API 调用、Streaming/SSE、超时重试与降级降本
高频面试题 051:OpenAI-compatible API 统一协议结构与 Message 角色演进?
1. 面试官为什么问这个问题?
面试官问这个问题,是为了考核你对 OpenAI API 标准规范(已被 DeepSeek, Qwen, GLM, Claude 转换器广泛兼容) 的理解,以及能否在工程中处理不同 role 的消息上下文。
2. 30 秒回答
“OpenAI-compatible API 已成为行业通用标准,核心是 /v1/chat/completions 接口。 消息角色 (messages[].role) 演进与职责:
system:系统设定/最高宪法(定义角色、行为准则、格式规范、输出限制)。user:用户输入的提问或 Prompt 指令。assistant:模型生成的历史回答或在 Tool Calling 时模型的中间思考/工具调用声明。tool(前身为function):后端执行完工具后,将工具的返回值(JSON)回传给大模型的专门角色。”
3. Code / JSON
3.1 生产级:包含 Tool Calling 的完整 Message 数组 JSON
json
{
"model": "gpt-4o",
"messages": [
{ "role": "system", "content": "你是一个严谨的退款助手。" },
{ "role": "user", "content": "请帮我退款订单 ORD-9901" },
{
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "refund_order",
"arguments": "{\"order_id\":\"ORD-9901\"}"
}
}
]
},
{
"role": "tool",
"tool_call_id": "call_abc123",
"content": "{\"status\":\"SUCCESS\",\"msg\":\"退款成功\"}"
}
]
}4. 面试项目话术
“我熟练掌握 OpenAI-compatible 统一 API 协议。 理解 system, user, assistant, tool 四种角色的协同流转机制。在多模型接入层中,基于该标准封装了统一适配器,实现了 OpenAI、DeepSeek、通义千问等模型的无缝切换。”
5. 最后记忆
口诀:System 立宪法,User 提需求;Assistant 记历史,Tool 返结果。
高频面试题 052:Streaming (HTTP Chunked & SSE) 底层原理与断线重连实战?
1. 面试官为什么问这个问题?
面试官问这个问题,是为了考核你是否掌握 LLM 流式输出 (Streaming) 的网络传输机制 (SSE / HTTP Chunked) 与前后端容错处理。
2. 30 秒回答
“LLM 生成文本是自回归逐 Token 的,为了降低用户感知的 首 Token 延迟 (TTFT - Time To First Token),生产环境一律使用 Streaming 流式传输。 原理:请求带上 "stream": true。服务端设置 HTTP 响应头 Content-Type: text/event-stream 和 Transfer-Encoding: chunked。 服务端以 SSE (Server-Sent Events) 格式不断推送 data: {"choices":[{"delta":{"content":"Token"}}]}\n\n 帧,最后推 data: [DONE] 结束。 前端与后端网关通过 EventSource 或 Fetch ReadableStream 解析字节流。若中途断线,通过带上 Last-Event-ID 建立重连与补发。”
3. Code / Python
3.1 Python asyncio 处理 OpenAI 流式 API 并推给 SSE
python
import openai
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
app = FastAPI()
async def llm_stream_generator(prompt: str):
client = openai.AsyncOpenAI()
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
stream=True
)
async for chunk in response:
content = chunk.choices[0].delta.content or ""
if content:
# 拼装标准 SSE 格式
yield f"data: {content}\n\n"
yield "data: [DONE]\n\n"
@app.get("/api/chat/stream")
async def chat_stream(prompt: str):
return StreamingResponse(
llm_stream_generator(prompt),
media_type="text/event-stream"
)4. 面试项目话术
“我精通 LLM Streaming 流式传输与 SSE 协议。 理解 Transfer-Encoding: chunked 与 text/event-stream 物理原理。在网关层通过 Swoole/FastAPI 实现了流式管道代理,配合 Nginx proxy_buffering off 确保逐字流畅吐出,将 TTFT 感知延迟从 5 秒降至 300 毫秒。”
5. 最后记忆
口诀:Stream 设为 true,SSE 推流 content-type;Nginx 记得关 buffer,TTFT 降至 300 毫秒。
高频面试题 053:Function Calling (Tool Calling) 物理全历程与闭环实现?
1. 面试官为什么问这个问题?
面试官问这个问题,是为了考核你对 Agent 驱动外部系统 (Tool Calling) 全生命周期调用的掌握程度。
2. 30 秒回答
“Function Calling 的本质是:大模型根据用户请求与传入的 Tools Schema,决定调用哪个工具并输出格式化的 JSON 入参,但模型本身不执行代码,执行权在后端。 完整 4 步闭环:
- 定义 Tools:后端在 API 请求中传入
tools数组(包含函数名、描述与 JSON Schema 入参规约)。 - 模型决定调用:LLM 判定需要调工具,返回
finish_reason = "tool_calls",并输出tool_calls[].function。 - 后端本地执行:后端解析 JSON 入参,调用真实本地代码/API。
- 结果回传:后端将执行结果组装为
role = "tool"消息追加到上下文,再次请求 LLM,生成最终自然语言回答。”
3. Code / Python
3.1 Python 完整 Function Calling 四步闭环代码
python
import openai
import json
client = openai.OpenAI()
# 1. 定义 Tool Schema
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的实时天气",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "城市名称"}
},
"required": ["location"]
}
}
}]
messages = [{"role": "user", "content": "北京今天天气怎么样?"}]
# 2. 第一次请求 LLM
response = client.chat.completions.create(model="gpt-4o", messages=messages, tools=tools)
msg = response.choices[0].message
if msg.tool_calls:
# 3. 后端本地执行代码
tool_call = msg.tool_calls[0]
args = json.loads(tool_call.function.arguments)
result = {"temperature": "25°C", "condition": "晴朗"} # 模拟 API 查询
# 4. 追加结果并二次请求 LLM
messages.append(msg)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": json.dumps(result)
})
final_res = client.chat.completions.create(model="gpt-4o", messages=messages)
print(final_res.choices[0].message.content)4. 面试项目话术
“我熟练掌握 Function Calling 全流程闭环实现。 理解工具定义、模型判定 tool_calls、后端安全执行与 role=tool 二次反哺的机制。在工具执行层加入了强 Schema 校验与幂等防重锁,保障了 Agent 工具调用的绝对可靠。”
5. 最后记忆
口诀:传 Schema 给模型,模型输出 tool_calls;后端执行返结果,追加上下文做回答。
高频面试题 054:Structured Output (结构化输出) 强约束原理与 Pydantic / Instructor 库实战?
1. 面试官为什么问这个问题?
面试官问这个问题,是为了考核你如何解决 LLM 输出非确定性 JSON 导致的解析崩溃问题。
2. 30 秒回答
“实现 Structured Output (结构化输出) 有三种工程层次:
- JSON Mode (
response_format: {"type": "json_object"}):要求 Prompt 明确包含JSON关键字,模型尽力输出合法 JSON,但无法强约束 Schema 字段名。 - OpenAI 官方 Strict Structured Outputs (
response_format: json_schema):基于语法树强制截断(Grammar-based Constrained Sampling),在 Token 采样阶段拒绝产生不合法的 Token,实现 100% 遵守 Schema。 - Python Instructor / Pydantic 库:在客户端提供类型提示、自动重试与校验。”
3. Code / Python
3.1 使用 Pydantic + OpenAI 实现 100% 结构化输出
python
from pydantic import BaseModel, Field
import openai
class UserProfile(BaseModel):
name: str = Field(description="用户姓名")
age: int = Field(description="用户年龄")
tags: list[str] = Field(description="标签列表")
client = openai.OpenAI()
completion = client.beta.chat.completions.parse(
model="gpt-4o-2024-08-06",
messages=[{"role": "user", "content": "张三今年28岁,喜欢编程和跑步"}],
response_format=UserProfile, # 传入 Pydantic 模型
)
user: UserProfile = completion.choices[0].message.parsed
print(user.name, user.age, user.tags)4. 面试项目话术
“我熟练掌握 LLM Structured Output 结构化输出技术。 理解简单 JSON Mode 与语法树限制采样(Constrained Sampling)的本质区别。在 Agent 入参解析中全量引入 Pydantic / Instructor 库做强类型约束,消除了 JSON 解析 Crash 现象。”
5. 最后记忆
口诀:JSON Mode 仅保语法,Strict Schema 保字段;Pydantic 类型强约束,解析崩溃彻底消。
高频面试题 055:高并发 LLM API 超时重试 (指数退避) 与多模型 Router Fallback 熔断降级?
1. 面试官为什么问这个问题?
面试官问这个问题,是为了考核你构建 高可用 AI 应用基础设施 (AI Gateway) 的容错与降级设计能力。
2. 30 秒回答
“大模型 API 存在高延迟、频繁 429 (Rate Limit) 与 5xx (服务爆满) 的特点。 高可用网关三重防御:
- 指数退避重试 (Exponential Backoff + Jitter):当遇到 429/503 时,重试时间按 $2^x + \text{rand()}$ 递增,避免集中冲垮 API。
- 超时控制 (Timeout):设置首 Token 5 秒硬 Timeout,超时立刻中断。
- Fallback 自动降级与熔断器 (Circuit Breaker):主模型 (如 Claude 3.5) 连续失败 3 次触发熔断冷却,网关自动无缝降级切换至 Standby 备用模型 (如 DeepSeek-R1 / Qwen 2.5),保证前端服务永不瘫痪。”
3. Code / Python
3.1 生产级:带指数退避与 Fallback 自动降级的模型调用器
python
import time
import random
import openai
PRIMARY_MODEL = "gpt-4o"
FALLBACK_MODEL = "qwen-max"
def call_llm_with_fallback(messages: list, max_retries: int = 3):
client = openai.OpenAI()
# 1. 尝试主模型 (带指数退避)
for attempt in range(max_retries):
try:
return client.chat.completions.create(
model=PRIMARY_MODEL,
messages=messages,
timeout=5.0 # 5s 超时
)
except (openai.RateLimitError, openai.APIConnectionError, openai.InternalServerError) as e:
if attempt == max_retries - 1:
break
sleep_time = (2 ** attempt) + random.uniform(0, 1)
time.sleep(sleep_time)
# 2. 主模型彻底失败/超时,触发 Fallback 无缝降级至备用模型
print(f"主模型 {PRIMARY_MODEL} 挂掉,自动降级切换至 {FALLBACK_MODEL}")
return client.chat.completions.create(
model=FALLBACK_MODEL,
messages=messages,
timeout=8.0
)4. 面试项目话术
“我设计并落地了 AI 网关高可用降级与熔断体系。 针对第三方 LLM API 不稳定的问题,引入指数退避重试 (Exponential Backoff) 防冲垮,设置 5 秒硬 Timeout 拦截卡死;主模型熔断后自动 Fallback 降级至 Qwen/DeepSeek 备用节点。这套机制保障了 AI 服务在供应商宕机时依然达到了 99.99% 的高可用。”
5. 最后记忆
口诀:超时 5 秒硬拦截,指数退避防冲垮;主模型挂自动降,Fallback 备用保可用。
🔍 本章 6 重自审计报告
- 【知识审计】:覆盖 OpenAI API 统一协议、4 种 Message 角色、Streaming/SSE 原理、Function Calling 4 步闭环、Strict Structured Output (Pydantic)、指数退避与 Fallback 熔断降级。
- 【面试审计】:每题符合 12 大模块,含 30 秒回答、Python 生产代码与口诀。