ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【Agent】LLM格式化输出(二)

【Agent】LLM格式化输出(二) 作为上一篇文章引导解码的补充我们进一步介绍vLLM的引导解码。注意本篇文章基于vllm 0.16.0。vllm的语法变更频繁请以最新的文档为准。输出数组我们以一个最简单的例子让LLM只输出数组# 2. 定义 JSON Schema 约束 (强制输出整数数组)json_schema{type:array,items:{type:integer},minItems:3,maxItems:10}# 3. 构造请求 Payloadpayload{model:MODEL_NAME,messages:[{role:system,content:你是一个严格遵循格式要求的助手。},{role:user,content:请列出前 5 个质数。必须严格以 JSON 数组格式输出不要包含任何 Markdown 标记如 json或其他解释文字。}],temperature:0.7,max_tokens:100,# 核心在顶层传入 guided_json 参数{structured_outputs:{json:json_schema}}}还是同样的道理如果不使用 openai 后端只是在代码里调用 LLM还可以用fromvllmimportLLM,SamplingParamsfromvllm.sampling_paramsimportStructuredOutputsParams llmLLM(modelHuggingFaceTB/SmolLM2-1.7B-Instruct)# 2. 定义 JSON Schema 约束# 这里的 Schema 规定输出必须是一个数组且数组内的元素必须是整数guided_json_schema{type:array,items:{type:integer},# 可选限制数组长度防止模型输出过长或过短minItems:3,maxItems:10}structured_outputs_paramsStructuredOutputsParams(jsonguided_json_schema)sampling_paramsSamplingParams(structured_outputsstructured_outputs_params)outputsllm.generate(prompts请列出前 5 个质数。必须严格以 JSON 数组格式输出不要包含任何 Markdown 标记如 json或其他解释文字。,sampling_paramssampling_params,)print(outputs[0].outputs[0].text)和上一篇文章所介绍的一样如果需要LLM格式化输出需要保证两点提示词需要写明格式化输出需要启用引导解码EBNF 驱动下更复杂的输出扩展巴科斯-瑙尔范式(Extended Backus–Naur Form,EBNF)是一种用于描述计算机编程语言等正式语言的与上下文无关语法的元语法(metasyntax)符号表示法。简而言之它是一种描述语言的语言。它是基本巴科斯范式(BNF)元语法符号表示法的一种扩展。当然我是不会写 EBNF 范式的这不影响使用可以找模型来生成。要生成一个合法的 JSON 整数数组如 [1, -2, 34]我们需要定义数组结构、元素、整数以及允许的空格。root ::[ws elements ws]elements ::element(,ws element)* element ::integer integer ::-?[0-9] ws ::[\t\n]*文法解析root: 定义整体必须是以 [ 开始] 结束中间是 elements且允许首尾有空格 (ws)。elements: 定义元素列表至少一个 element后面可以跟 0 个或多个由 , 和空格隔开的 element。integer: 定义整数可选的负号 - 加上一个或多个数字 [0-9]。ws: 定义空白字符空格、制表符、换行符用于提高模型生成的容错率。使用 openai 后端的服务下我们可以如下编写代码grammar_strr root :: [ ws elements ws ] elements :: element (, ws element)* element :: integer integer :: -? [0-9] ws :: [ \t\n]* # 3. 构造请求 Payloadpayload{model:MODEL_NAME,messages:[{role:system,content:你是一个严格遵循格式要求的助手。},{role:user,content:请列出前 5 个质数。必须严格以 JSON 数组格式输出不要包含任何 Markdown 标记如 json或其他解释文字。}],temperature:0.7,max_tokens:100,# 核心在顶层传入 guided_json 参数{structured_outputs:{grammar:grammar_str}}}当然既然有EBNF就可以实现更加复杂的表达式。LLM只能生成数组吗如果让LLM生成可执行的代码是否就能拿来执行了呢
返回列表