【Hackathon 9th Sprint No.60】【RFC】为 FastDeploy 新增支持 DeepSeek 模型的 Reasoning Parser & Tool Parser by fgeygfe · Pull Request #1185 · PaddlePaddle/community (original) (raw)
对于具体执行方案,给一个以下建议:
根据不同模型输出协议的差异制定不同的执行方案(Review 的时候,也会与方案进行对齐)。
首先,列举模型,正常返回是的协议情况, 例如(不一定是 Deepseek 模型的示例)
有调用工具意图的时候:reasoning_content</think>\n\n<tool_call>xxx</tool_call><tool_call>xxx</tool_call></s>
无调用工具意图的时候:reasoning_content</think>content</s>
其次,制定在不同输出场景的处理方案, 例如:
- 未出现
</think>场景, 如:ABCD;
- 如果模型处于思考开始阶段,这些应该是异常结果,会被解析到思考内容中;
- 如果模型处于思考结束阶段,这些应该是回复内容
- 未出现<tool_call>, 如
ABCD </think> EFG
- (不再详细列举)
- 出现
<tool_call>, 但与</think>之间有 非\n字符,如ABCD </think>\nEFG\n<tool_cal>XXX</tool_call>
- 视为异常情况
- 考虑流式过程遇到 EFG时, 会当做 content 内容, 因此,当前情况后续可以都作为 content 内容, 不去做工具解析(tool_call_parser 要做该情况判断,跳过解析)。
- 出现
<tool_call>, 且与</think>之间仅有\n字符, 如ABCD </think>\n\n<tool_cal>XXX</tool_call>
- 视为正常情况, 流式过程遇到
<\think>后面的\n,可以考虑忽略。 - content 内容与 tool_call 内容,保持互斥。
- 多工具解析时,
</tool_call>与下一轮的<tool_call>之间有非\n 字符时, 可以忽略,如ABCD </think>\n\n<tool_cal>XXX</tool_call>\nXYZ\n<tool_call>XXX</tool_call> - 工具解析逻辑<tool_call>与</tool_call>之间任一个内容不合法时....
还可以进一步考虑非思考模式下,思考和工具的解析方案。