如何让大模型遵循你的结构化输出指令小技巧

企业应用增长营销混合云网络

换了工作后,熟悉业务、熟悉人、熟悉环境,每天都是新东西的输入,脑袋都装不下了 😭😭😭,还是蛮累的

给自己打打鸡血,时间都是挤出来的,人嘛,都是逼出来的。

最近看到一些大模型 JSON 格式输出的方法,这里简单说说,说不定有你需要的。

很多人说,为什么非要纠结 JSON 格式的输出,我用的挺好的,啥 JSON 格式都没弄过

上面这种说法的,要不就是用的不深,浅尝辄止

要不就是不是做 AI 开发的,要知道!开发最后的结构化结果是很重要的

比如你想要一些抽取好的关键信息,这时候怎么给你?

肯定是结构化的字段信息,简洁明了

当然,结构化的输出不止 JSON 一种,还有很多。

大家头疼的是,大模型(LLM)有时候不遵循指令,不按照你想要的格式输入,即使你在 prompt 中明确说了要按照 JSON 格式返回结果,但是它就是不听,你能怎么办,总不能不干了吧。

最简单的方式当然就是在 prompt 上面做功夫,让大模型遵循你的命令,成为你的听话的小猫咪 🐱

不要觉得这种很容易,这种结构化大模型输出格式的目前已经成为了很多人的研究课题。

下面的几个方法也不一定面面有效,但是是一种有效的思路,可以试试

输入即输出

按照 JSON 的格式喂给大模型,大模型会按照 JSON 的格式返回

比如一个信息抽取的任务,按照下面JSON格式的 prompt 喂给大模型,task 定义目标,restriction 给出 JSON 的限制,text 是文本输入,format 是定义好的输出 JSON 字段


            
              
{  
    "task": "从下面的<text>中抽取出对应的信息, <name>是姓名, <age>年龄, <work>职业",  
    "restriction": "给出类似<format>格式的JSON回答",  
    "text": "小张是一个 35 的大龄程序员",  
    "format": {  
        "data": {  
            "name": "name",  
            "age": a number,  
            "work": []  
        }  
    }  
}  

          

输出的结果是这样的。

picture.image

再比如一个query改写(根据对话历史上下文改写当前对话信息)的任务, 也是JSON格式的prompt


            
              
{  
    "task": "根据历史<history>信息, 对当前的<query>对话信息进行改写,使当前<query>语义清晰",  
    "restriction": "给出类似<format>格式的JSON回答",  
    "history": ["查询6月29号的天气情况"],  
    "query": "7月1号呢",  
    "format": {  
        "data": {  
            "result": "query rewrite result"  
        }  
    }  
}  

          

输出也是遵循JSON格式的

picture.image

这种方式就是输入的prompt就直接是结构化的JSON,定义好输出格式的format,给出明确的字段定义。

prompt中明确要求

在prompt中,不仅仅明确按照JSON的格式返回,还要给定JSON的案例

还是上面的信息抽取任务,给定的prompt如下


            
              
从下面的<text>中抽取出对应的姓名,年龄,职业信息, <text>: 小张是一个 35 的大龄程序员  
  
严格按照以下格式返回结果  
  
```json  
{  
    "name": "name",  
    "age": a number,  
    "work": []  
}  

          

输出的结果

picture.image

这种方式就是在提示词的基础之上,别写简单的那种按照JSON的格式给我返回结果,鬼知道能返回什么样的JSON,你要按照你的需求,给定对应返回的JSON案例,信息抽取任务就定义好要抽取那些信息,最好给定字段的解释或者案例。

再多的例子我就不写了,自己试试,任何大模型都可以试试,有badcase评论区反馈下。

还有一个,如果你用的是openAI的API,他们提供了这个参数 response_format ,可以设置为 { "type": "json_object" }

但是这种方式也不一定,最好还是在prompt中按照上面说的加一些输出的格式案例


        
          
import openai  
  
openai.api_key = 'your-api-key'  
  
response = openai.Completion.create(  
  model="text-davinci-003",  
  prompt="Translate the following English text to French: 'Hello, how are you?'",  
  response_format={ "type": "json\_object" }  
)  
  
print(response)  

      

那问题来了,像上面的写法能100%解决格式输出的问题嘛?

那你真的太小看大模型了

像大规模参数量的大模型还好一些,小规模参数量的大模型不遵循指令的问题相对明显。

有哪些case?

输出的JSON格式多一个少一个括号{},增加了一些\n空格等特殊字符,回复的内容比如 改写后的内容 + JSON格式结果

还是要做些后处理的

1、正则表达式 处理一些特殊的字符,或者提取返回结果中的JSON片段信息。

2、利用一些第三方库修复JSON badcase , 比如json_repair。

3、调整temperature的参数 ,调低点,甚至0。

4、重试机制 ,对无法解决的case进行重新提问,大模型偶尔一时的抽风不代表全部都有问题。

好了,困了,今天就写到这里了。

上面只是一些简单的写法,大模型结果的格式化输出已经是很多人的研究工作了,我后面看到会汇总一下,如果你也有类似的需求,关注下后面的文章吧。

<-End->

picture.image

我是大林,持续关注 AI 发展,和大家一起交流。微信(dalinvip2023),备注【公众号 AIGC】,进 AIGC 交流群一起交流。

主页:https://www.dalinaip.com/

如果文章对你有一点点 🤏🏻 帮助,关注公众号 并【星标】,可以及时收到最新 AI 信息,点赞、在看、帮忙转发给更多的朋友,谢谢。

往期推荐

又发现了一个很良心的 prompt 提示词库,简洁,有效,值得学习

RAG框架,都在这了!

总结优秀的prompt案例,学习更有效的prompt提示词工程写法,值得收藏

Kimi 太慢了,200万字上下文还没开放,不等了,先用下kimi的插件

几种高速下载大模型的方法

免魔法,非套壳API,国内使用GPT plus,和官网功能一模一样,强烈推荐!

0
0
0
0
关于作者
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论