LLM 可控性生成探索

type
status
date
slug
summary
tags
category
icon
password

TypeChat——把TypeScript 类型给模型作为输出规范

TypeChat使用类型 (Types) 来代替提示工程 (Prompt Engineering) ,通过定义类型 Schema 来构建自然语言交互接口。
设计思路:
  1. 首先通过 prompt 告知 LLM 我们所需要的返回格式,并进行生成。
  1. 通过规则来检查返回结果,如果不符合格式,生成相关错误信息。
  1. 将上一次的生成内容和检查的错误信息告知 LLM,进行下一次的修正生成。
  1. 重复 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语言那样复杂,很直观,示例:
生成效果:
notion image
其特点在于,黑色部分是预设的,蓝色部分是传入的,绿色部分才是模型生成的,其好处有两个
  • 生成的 json 结构是保证合法且可控的,不会出现语法错误或者缺失/错误字段等。
  • 通过 LLM 生成的 token 数量减少了,理论上可以提升生成速度。

更多特性

  • 支持多种触发命令,在遇到对应 prompt 的时候模型会执行相应操作:{{gen}}{{select}}{{#geneach}},函数调用,逻辑判断,控制流等
  • 支持 hidden block,例如 LLM 的一些推理过程可能并不需要暴露给最终用户,就可以灵活利用这个特性来生成一些中间结果。
  • Generation caching,自动把已经生成过的结果缓存起来,提升速度。
  • 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 信息缓存,提升了生成速度。
LangChain 上手记录,从实战开始温故知新,曾经的NLP王者BERT是如何进化的