LLM 可控性生成探索
type
status
date
slug
summary
tags
category
icon
password
TypeChat——把TypeScript 类型给模型作为输出规范
TypeChat使用类型 (Types) 来代替提示工程 (Prompt Engineering) ,通过定义类型 Schema 来构建自然语言交互接口。
设计思路:
- 首先通过 prompt 告知 LLM 我们所需要的返回格式,并进行生成。
- 通过规则来检查返回结果,如果不符合格式,生成相关错误信息。
- 将上一次的生成内容和检查的错误信息告知 LLM,进行下一次的修正生成。
- 重复 2-3 步骤,直到生成的内容完全符合我们的要求。
TypeChat 使用 Typescript 类型来作为 「Schema」,要求 ChatGPT 返回符合这个类型定义的数据。此外,目前附带一轮验证 + 纠错的能力,即验证模型生成的内容是否符合用户期望的 json 格式,如果不符合,连带着验证报错重新返回给模型,使模型纠正错误后返回正确的格式。
核心其实是以下的 prompt 设计:
用开源模型 mpt-30b-chat 体验下来比较一般,遇到对中文的理解,还没有合适规范的转换 schema 的方式;
guardrails
和 TypeChat 设计思路相似,但使用了 xml 格式的模版,不太好写;
实现:
- 定义了一套RAIL spec,用来描述上面第 1 点提到的返回格式限定。除了 output schema 的定义外,RAIL目前也支持 input schema,prompt 模板,以及 instructions 等其它配置。
- 提供了一系列的 validation 机制,对应上面的第 2 点。对于 validate 失败的部分,会保留其在 output schema 中的位置,生成相应的错误信息。
- 通过ReAsk类来实现上面的第 3 点,发送给 LLM 的内容会更聚焦于错误信息部分,且保留了结构,更便于 LLM 理解和处理。
guidance
概述
也是使用“模版语言”定义 LLM 输出结构确保格式正确性,但没有xml语言那样复杂,很直观,示例:
生成效果:
其特点在于,黑色部分是预设的,蓝色部分是传入的,绿色部分才是模型生成的,其好处有两个
- 生成的 json 结构是保证合法且可控的,不会出现语法错误或者缺失/错误字段等。
- 通过 LLM 生成的 token 数量减少了,理论上可以提升生成速度。
更多特性
- 支持多种触发命令,在遇到对应 prompt 的时候模型会执行相应操作:
{{gen}}
,{{select}}
,{{#geneach}}
,函数调用,逻辑判断,控制流等
- 支持 hidden block,例如 LLM 的一些推理过程可能并不需要暴露给最终用户,就可以灵活利用这个特性来生成一些中间结果。
- Generation caching,自动把已经生成过的结果缓存起来,提升速度。
- 支持 HuggingFace 模型的 guidance acceleration,进一步提升生成速度。
- Regex pattern guide,在模板的基础上进一步通过正则表达来限定生成的内容规范。
实现原理
遍历解析模版,对于固定内容直接填入,遇到需要生成的时候,把之前的内容作为 prompt 调用,比如前文代码第一次调用 LLM 进行生成的 prompt 就是:
讲 LLM 内容填入后,再解析模版后面的内容,再比如,遇到
{{select}}
命令时,会指定生成一个 token,并返回相应的 logprobs,然后通过 trie 树去匹配候选项,确定各自的概率,最后选择概率最高的那个。像 guidance acceleration 也是一个针对开源模型的功能,通过两个装饰器动替换了 transformers 模型中的
prepare_inputs_for_generation
和_update_model_kwargs_for_generation
两个方法,实现了模型 inference 过程中的 kv 信息缓存,提升了生成速度。Last update: 2023-08-01
type
status
date
slug
summary
tags
category
icon
password
🎉 欢迎来到我的小站!
📚 这里主要分享记录开发技术和AI知识👀
❤️ 若您认可我的内容,欢迎请我喝杯咖啡~