外贸网站建设课本,建设工程其它费计算网站,wordpress扒主题代码,广州外贸网站制作内容来源#xff1a;dotey 《如何控制 LLM 的输出格式和解析其输出结果#xff1f;》
https://baoyu.io/blog/prompt-engineering/how-to-parse-the-output-from-llm
现在很多人对于如何使用像 ChatGPT 这样的 LLM 已经比较有经验了#xff0c;可以使用各种不同的 Prompt … 内容来源dotey 《如何控制 LLM 的输出格式和解析其输出结果》
https://baoyu.io/blog/prompt-engineering/how-to-parse-the-output-from-llm
现在很多人对于如何使用像 ChatGPT 这样的 LLM 已经比较有经验了可以使用各种不同的 Prompt 得到自己想要的结果。但有时候我们的使用场景不局限于手动操作而是需要结合程序去调用 API并且解析 API 的返回结果从而实现一些自动化的功能。但是 LLM 的输出不确定性很大所以我们需要想办法去控制 LLM 的输出格式从而让程序得到稳定的输出并且进一步对输出结果进行解析。
方法一使用 Function Calling
Function Calling 是 OpenAI 不久前退出的针对 GPT API 的一个功能可以让 LLM 决定在输出最终结果前是否需要调用某个特定函数。比如说有用户问今天天气是什么那么 LLM 在输出结果前会先输出一个中间结果告诉你需要调用天气相关的函数并且传入这个函数的参数是“今天”。这样你就可以去调用天气函数拿到结果后告诉 LLM再输出最终结果给用户。
这个功能本意不是用来控制格式输出的但是它在告诉我们该调用什么函数时为了方便解析给我们输出的是一个标准 JSON 格式即使是 GPT-3.5也能得到比较稳定的 JSON 格式。所以我们可以利用这个特性来控制 LLM 的输出格式。
我们可以把要 ChatGPT 输出的内容定义成一个函数但我们实际上不需要执行这个函数只要 LLM 给我们的输出结果。 举例来说我希望 ChatGPT 给我输出的格式是一个 Object{ “name”: “John”, “age”: 30, “city”: “New York” }
我们可以在调用 GPT 的时候定义一个函数将函数的参数格式和要输出的 JSON 格式对应起来
{ “name”: “getUserInfo”, “description”: “Get user information”, “parameters”: { “type”: “object”, “properties”: { “name”: { “type”: “string”, “description”: “User’s fullname” }, “age”: { “type”: “number”, “description”: “User’s age” }, “name”: { “type”: “string”, “description”: “User’s city” }, }, “required”: [“name”, “age”, “city”] } }
然后在调用 GPT 的时候我们可以这样写参考图一
这样我们就可以得到一个稳定的 JSON 格式的输出结果。这种方法的局限在于必须 API 支持 Function Calling。
Function Calling 的具体用法可以参考
OpenAI 的文档https://platform.openai.com/docs/guides/text-generation/function-calling
方法二使用 few-shot给出输出格式样例
如果 API 不支持 Function Calling那么我们可以使用 few-shot 的方式给出一个甚至多个输出格式的样例让 LLM 按照这个样例去输出结果。
比如我在翻译时会让 LLM 翻译两次一次直译一次意译然后采用意译的结果。这种情况下我不需要用 JSON 格式只需要简单的用特殊字符将两次结果隔开然后按照特殊字符一分割就可以得到意译的结果。
Prompt 参考图二
如果是 JSON 格式也可以用 few-shot 说明但是对于 GPT-3.5稳定性不够好有时候会出现不符合格式的情况。
Ensure that your response can be parsed by Python json, use the following format as an example: { “name”: “John”, “age”: 30, “city”: “New York” } 举例来说我希望 ChatGPT 给我输出的格式是一个 Object{ “name”: “John”, “age”: 30, “city”: “New York” }
我们可以在调用 GPT 的时候定义一个函数将函数的参数格式和要输出的 JSON 格式对应起来
{ “name”: “getUserInfo”, “description”: “Get user information”, “parameters”: { “type”: “object”, “properties”: { “name”: { “type”: “string”, “description”: “User’s fullname” }, “age”: { “type”: “number”, “description”: “User’s age” }, “name”: { “type”: “string”, “description”: “User’s city” }, }, “required”: [“name”, “age”, “city”] } }
然后在调用 GPT 的时候我们可以这样写参考图一
这样我们就可以得到一个稳定的 JSON 格式的输出结果。这种方法的局限在于必须 API 支持 Function Calling。
Function Calling 的具体用法可以参考
OpenAI 的文档https://platform.openai.com/docs/guides/text-generation/function-calling
方法二使用 few-shot给出输出格式样例
如果 API 不支持 Function Calling那么我们可以使用 few-shot 的方式给出一个甚至多个输出格式的样例让 LLM 按照这个样例去输出结果。
比如我在翻译时会让 LLM 翻译两次一次直译一次意译然后采用意译的结果。这种情况下我不需要用 JSON 格式只需要简单的用特殊字符将两次结果隔开然后按照特殊字符一分割就可以得到意译的结果。
Prompt 参考图二
如果是 JSON 格式也可以用 few-shot 说明但是对于 GPT-3.5稳定性不够好有时候会出现不符合格式的情况。
Ensure that your response can be parsed by Python json, use the following format as an example: { “name”: “John”, “age”: 30, “city”: “New York” } ChatGPT 的输出结果控制
如果是 ChatGPT由于是网页直接操作并且它支持 Markdown 格式通常我会把我想要的结果放在 Markdown 的代码块中这样就可以直接复制粘贴出来但有时候也不是很稳定。
参考 Prompt
请按照上面的规则和下面的格式打印翻译结果返回格式如下{xxx}表示占位符…
直译
{直译结果} 意译
{意译结果}

容错处理 由于生成式 AI 现阶段的特点我们很难保证输出结果的稳定性所以我们需要对输出结果进行容错处理以防止程序出错。这是我的一些经验总结降低 temprature 参数的值会让结果更稳定。temprature 越低输出结果越稳定当然温度低会影响输出结果的多样性你可以灵活运用比如出错后降低 temprature 值。2. 对 JSON 结果进行容错处理即使是 GPT-4输出 JSON 时也不够稳定经常会错误输出多余的逗号或者引号但是老是重试也废 token所以最好是用日志把出错的结果都记录下来找出其中的规律然后做一些字符串预处理降低出错概率。比如这里是我针对我的程序写的一个处理 JSON 错误的函数参考图一仅供参考最好还是你根据自己的 JSON 格式记录日志然后针对你的错误情况去写容错函数。
