Files
FastDeploy/docs/zh/online_serving/README.md
2025-09-09 09:50:45 +08:00

407 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 兼容 OpenAI 协议的服务化部署
FastDeploy 提供与 OpenAI 协议兼容的服务化部署方案。用户可以通过如下命令快速进行部署:
```bash
python -m fastdeploy.entrypoints.openai.api_server \
--model baidu/ERNIE-4.5-0.3B-Paddle \
--port 8188 --tensor-parallel-size 8 \
--max-model-len 32768
```
如果要启用输出token的logprob用户可以通过如下命令快速进行部署
```bash
python -m fastdeploy.entrypoints.openai.api_server \
--model baidu/ERNIE-4.5-0.3B-Paddle \
--port 8188 --tensor-parallel-size 8 \
--max-model-len 32768 \
--enable-logprob
```
服务部署时的命令行更多使用方式参考[参数说明](../parameters.md)。
## Chat Completion API
FastDeploy 接口兼容 OpenAI 的 Chat Completion API用户可以通过 OpenAI 协议发送用户请求。
### 发送用户请求
使用 curl 命令发送用户请求示例如下:
```bash
curl -X POST "http://0.0.0.0:8188/v1/chat/completions" \
-H "Content-Type: application/json" \
-d '{
"messages": [
{"role": "user", "content": "Hello!"}
]
}'
```
使用 curl 命令示例演示如何在用户请求中包含logprobs参数
```bash
curl -X POST "http://0.0.0.0:8188/v1/chat/completions" \
-H "Content-Type: application/json" \
-d '{
"messages": [
{"role": "user", "content": "Hello!"}
],
"logprobs": true, "top_logprobs": 0,
}'
```
使用 Python 脚本发送用户请求示例如下:
```python
import openai
host = "0.0.0.0"
port = "8170"
client = openai.Client(base_url=f"http://{host}:{port}/v1", api_key="null")
response = client.chat.completions.create(
model="null",
messages=[
{"role": "system", "content": "I'm a helpful AI assistant."},
{"role": "user", "content": "把李白的静夜思改写为现代诗"},
],
stream=True,
)
for chunk in response:
if chunk.choices[0].delta:
print(chunk.choices[0].delta.content, end='')
print('\n')
```
关于 OpenAI 协议的说明可参考文档 [OpenAI Chat Completion API](https://platform.openai.com/docs/api-reference/chat/create)。
### 兼容OpenAI 参数
```python
messages: Union[List[Any], List[int]]
# 输入消息列表,可以是文本消息(`List[Any]`,通常为 `List[dict]`)或 token ID 列表(`List[int]`)。
tools: Optional[List[ChatCompletionToolsParam]] = None
# 工具调用配置列表用于启用函数调用Function Calling或工具使用如 ReAct 框架)。
model: Optional[str] = "default"
# 指定使用的模型名称或版本,默认值为 `"default"`(可能指向基础模型)。
frequency_penalty: Optional[float] = None
# 频率惩罚系数,降低重复生成相同 token 的概率(`>1.0` 抑制重复,`<1.0` 鼓励重复,默认 `None` 禁用)。
logprobs: Optional[bool] = False
# 是否返回每个生成 token 的对数概率log probabilities用于调试或分析。
top_logprobs: Optional[int] = 0
# 返回每个生成位置概率最高的 `top_logprobs` 个 token 及其对数概率(默认 `0` 表示不返回)。
max_tokens: Optional[int] = Field(
default=None,
deprecated="max_tokens is deprecated in favor of the max_completion_tokens field",
)
# 已弃用:生成的最大 token 数(建议改用 `max_completion_tokens`)。
max_completion_tokens: Optional[int] = None
# 生成的最大 token 数(推荐替代 `max_tokens`),默认无限制(受模型上下文窗口限制)。
presence_penalty: Optional[float] = None
# 存在惩罚系数,降低新主题(未出现过的话题)的生成概率(`>1.0` 抑制新话题,`<1.0` 鼓励新话题,默认 `None` 禁用)。
stream: Optional[bool] = False
# 是否启用流式输出(逐 token 返回结果),默认 `False`(一次性返回完整结果)。
stream_options: Optional[StreamOptions] = None
# 流式输出的额外配置(如分块大小、超时等),需参考 `StreamOptions` 的具体定义。
temperature: Optional[float] = None
# 温度系数,控制生成随机性(`0.0` 确定性生成,`>1.0` 更随机,默认 `None` 使用模型默认值)。
top_p: Optional[float] = None
# 核采样nucleus sampling阈值只保留概率累计超过 `top_p` 的 token默认 `None` 禁用)。
response_format: Optional[AnyResponseFormat] = None
# 指定输出格式(如 JSON、XML 等),需传入预定义的格式配置对象。
user: Optional[str] = None
# 用户标识符,用于跟踪或区分不同用户的请求(默认 `None` 不传递)。
metadata: Optional[dict] = None
# 附加元数据,用于传递自定义信息(如请求 ID、调试标记等
```
### FastDeploy 增加额外参数
> 注:
使用 curl 命令发送请求时, 可以直接使用以下参数;
使用openai.Client 发送请求时,需要使用将以下参数放入 `extra_body` 参数中, 如:`extra_body={"chat_template_kwargs": {"enable_thinking":True}, "include_stop_str_in_output": True}`
额外采样参数的支持如下:
```python
top_k: Optional[int] = None
# 限制每一步生成时只考虑概率最高的 K 个 token用于控制随机性默认 None 表示不限制)。
min_p: Optional[float] = None
# 核采样nucleus sampling阈值只保留概率累计超过 min_p 的 token默认 None 表示禁用)。
min_tokens: Optional[int] = None
# 强制生成的最小 token 数,避免过早截断(默认 None 表示不限制)。
include_stop_str_in_output: Optional[bool] = False
# 是否在输出中包含停止符stop string的内容默认 False即遇到停止符时截断输出
bad_words: Optional[List[str]] = None
# 禁止生成的词汇列表(例如敏感词),模型会避免输出这些词(默认 None 表示不限制)。
bad_words_token_ids: Optional[List[int]] = None
# 禁止生成的token id列表模型会避免输出这些词默认 None 表示不限制)。
repetition_penalty: Optional[float] = None
# 重复惩罚系数,降低已生成 token 的重复概率(>1.0 抑制重复,<1.0 鼓励重复,默认 None 表示禁用)。
```
其他参数的支持如下:
```python
chat_template_kwargs: Optional[dict] = None
# 传递给聊天模板chat template的额外参数用于自定义对话格式默认 None
chat_template: Optional[str] = None
# 自定义聊天模板,会覆盖模型默认的聊天模板,(默认 None
reasoning_max_tokens: Optional[int] = None
# 推理(如 CoT, 思维链)过程中生成的最大 token 数(默认 None 表示使用全局 max_tokens
structural_tag: Optional[str] = None
# 结构化标签,用于标记生成内容的特定结构(如 JSON、XML 等,默认 None
guided_json: Optional[Union[str, dict, BaseModel]] = None
# 引导生成符合 JSON 结构的内容,可以是 JSON 字符串、字典或 Pydantic 模型(默认 None
guided_regex: Optional[str] = None
# 引导生成符合正则表达式规则的内容(默认 None 表示不限制)。
guided_choice: Optional[List[str]] = None
# 引导生成内容从指定的候选列表中选择(默认 None 表示不限制)。
guided_grammar: Optional[str] = None
# 引导生成符合语法规则(如 BNF的内容默认 None 表示不限制)。
return_token_ids: Optional[bool] = None
# 是否返回生成结果的 token ID 而非文本(默认 None 表示返回文本)。
prompt_token_ids: Optional[List[int]] = None
# 直接传入 prompt 的 token ID 列表,跳过文本编码步骤(默认 None 表示使用文本输入)。
disable_chat_template: Optional[bool] = False
# 是否禁用聊天模板渲染,直接使用原始输入(默认 False 表示启用模板)。
temp_scaled_logprobs: Optional[bool] = False
# 计算logprob时是否对logits除以温度系数默认 False 表示不除以温度系数)。
top_p_normalized_logprobs: Optional[bool] = False
# 计算logprob时是否进行 top_p 归一化(默认 False 表示不进行top_p归一化
```
### 返回字段差异
FastDeploy 增加的返回字段如下:
- `arrival_time`:返回所有 token 的累计耗时
- `reasoning_content`: 思考链的返回结果
- `prompt_token_ids`: 输入序列的 token id 列表
- `completion_token_ids`: 输出序列的 token id 列表
返回参数总览:
```python
ChatCompletionResponse:
id: str
object: str = "chat.completion"
created: int = Field(default_factory=lambda: int(time.time()))
model: str
choices: List[ChatCompletionResponseChoice]
usage: UsageInfo
ChatCompletionResponseChoice:
index: int
message: ChatMessage
logprobs: Optional[LogProbs] = None
finish_reason: Optional[Literal["stop", "length", "tool_calls", "recover_stop"]]
ChatMessage:
role: str
content: str
reasoning_content: Optional[str] = None
prompt_token_ids: Optional[List[int]] = None
completion_token_ids: Optional[List[int]] = None
# 返回流式响应的字段
ChatCompletionStreamResponse:
id: str
object: str = "chat.completion.chunk"
created: int = Field(default_factory=lambda: int(time.time()))
model: str
choices: List[ChatCompletionResponseStreamChoice]
usage: Optional[UsageInfo] = None
ChatCompletionResponseStreamChoice:
index: int
delta: DeltaMessage
logprobs: Optional[LogProbs] = None
finish_reason: Optional[Literal["stop", "length", "tool_calls"]] = None
arrival_time: Optional[float] = None
DeltaMessage:
role: Optional[str] = None
content: Optional[str] = None
prompt_token_ids: Optional[List[int]] = None
completion_token_ids: Optional[List[int]] = None
reasoning_content: Optional[str] = None
```
## Completion API
Completion API 接口主要用于续聊场景, 适应于用户自定义好上下文输入, 并希望模型仅输出续写内容的场景; 推理过程不会增加其他 `prompt`拼接。:
### 发送用户请求
使用 curl 命令发送用户请求示例如下:
```bash
curl -X POST "http://0.0.0.0:8188/v1/completions" \
-H "Content-Type: application/json" \
-d '{
"prompt": "以下是一篇关于深圳文心公园的500字游记和赏析"
}'
```
使用 Python 脚本发送用户请求示例如下:
```python
import openai
host = "0.0.0.0"
port = "8170"
client = openai.Client(base_url=f"http://{host}:{port}/v1", api_key="null")
response = client.completions.create(
model="default",
prompt="以下是一篇关于深圳文心公园的500字游记和赏析",
stream=False,
)
print(response.choices[0].text)
```
关于 OpenAI 协议的说明可参考文档 [OpenAI Completion API](https://platform.openai.com/docs/api-reference/completions/create)。
### 兼容OpenAI 参数
```python
model: Optional[str] = "default"
# 指定使用的模型名称或版本,默认值为 `"default"`(可能指向基础模型)。
prompt: Union[List[int], List[List[int]], str, List[str]]
# 输入提示,支持多种格式:
# - `str`: 纯文本提示(如 `"Hello, how are you?"`)。
# - `List[str]`: 多段文本(如 `["User:", "Hello!", "Assistant:", "Hi!"]`)。
# - `List[int]`: 直接传入 token ID 列表(如 `[123, 456]`)。
# - `List[List[int]]`: 多段 token ID 列表(如 `[[123], [456, 789]]`)。
best_of: Optional[int] = None
# 生成 `best_of` 个候选结果,然后返回其中评分最高的一个(需配合 `n=1` 使用)。
frequency_penalty: Optional[float] = None
# 频率惩罚系数,降低重复生成相同 token 的概率(`>1.0` 抑制重复,`<1.0` 鼓励重复)。
logprobs: Optional[int] = None
# 返回每个生成 token 的对数概率log probabilities可指定返回的候选数量。
max_tokens: Optional[int] = None
# 生成的最大 token 数(包括输入和输出),默认无限制(受模型上下文窗口限制)。
presence_penalty: Optional[float] = None
# 存在惩罚系数,降低新主题(未出现过的话题)的生成概率(`>1.0` 抑制新话题,`<1.0` 鼓励新话题)。
```
### FastDeploy 增加额外参数
> 注:
使用 curl 命令发送请求时, 可以直接使用以下参数;
使用openai.Client 发送请求时,需要使用将以下参数放入 `extra_body` 参数中, 如:`extra_body={"chat_template_kwargs": {"enable_thinking":True}, "include_stop_str_in_output": True}`
额外采样参数的支持如下:
```python
top_k: Optional[int] = None
# 限制每一步生成时只考虑概率最高的 K 个 token用于控制随机性默认 None 表示不限制)。
min_p: Optional[float] = None
# 核采样nucleus sampling阈值只保留概率累计超过 min_p 的 token默认 None 表示禁用)。
min_tokens: Optional[int] = None
# 强制生成的最小 token 数,避免过早截断(默认 None 表示不限制)。
include_stop_str_in_output: Optional[bool] = False
# 是否在输出中包含停止符stop string的内容默认 False即遇到停止符时截断输出
bad_words: Optional[List[str]] = None
# 禁止生成的词汇列表(例如敏感词),模型会避免输出这些词(默认 None 表示不限制)。
repetition_penalty: Optional[float] = None
# 重复惩罚系数,降低已生成 token 的重复概率(>1.0 抑制重复,<1.0 鼓励重复,默认 None 表示禁用)。
```
其他参数的支持如下:
```python
guided_json: Optional[Union[str, dict, BaseModel]] = None
# 引导生成符合 JSON 结构的内容,可以是 JSON 字符串、字典或 Pydantic 模型(默认 None
guided_regex: Optional[str] = None
# 引导生成符合正则表达式规则的内容(默认 None 表示不限制)。
guided_choice: Optional[List[str]] = None
# 引导生成内容从指定的候选列表中选择(默认 None 表示不限制)。
guided_grammar: Optional[str] = None
# 引导生成符合语法规则(如 BNF的内容默认 None 表示不限制)。
return_token_ids: Optional[bool] = None
# 是否返回生成结果的 token ID 而非文本(默认 None 表示返回文本)。
prompt_token_ids: Optional[List[int]] = None
# 直接传入 prompt 的 token ID 列表,跳过文本编码步骤(默认 None 表示使用文本输入)。
```
### 返回参数总览
```python
CompletionResponse:
id: str
object: str = "text_completion"
created: int = Field(default_factory=lambda: int(time.time()))
model: str
choices: List[CompletionResponseChoice]
usage: UsageInfo
CompletionResponseChoice:
index: int
text: str
prompt_token_ids: Optional[List[int]] = None
completion_token_ids: Optional[List[int]] = None
arrival_time: Optional[float] = None
logprobs: Optional[int] = None
reasoning_content: Optional[str] = None
finish_reason: Optional[Literal["stop", "length", "tool_calls"]]
# 返回流式响应的字段
CompletionStreamResponse
id: str
object: str = "text_completion"
created: int = Field(default_factory=lambda: int(time.time()))
model: str
choices: List[CompletionResponseStreamChoice]
usage: Optional[UsageInfo] = None
CompletionResponseStreamChoice:
index: int
text: str
arrival_time: float = None
prompt_token_ids: Optional[List[int]] = None
completion_token_ids: Optional[List[int]] = None
logprobs: Optional[float] = None
reasoning_content: Optional[str] = None
finish_reason: Optional[Literal["stop", "length", "tool_calls"]] = None
```