LLM 格式化输出——Guided Decoding
介绍与示例
Guided decoding 技术能让大模型的输出满足特定的格式约束,如 Json、正则表达式等。并且,相比于在 prompt 中告知输出约束,guided decoding 是绝对稳定可靠的。
Guided decoding 也叫 structured output。下面是一个使用示例,约束大模型的输出为一个 pydantic 的 BaseModel:
class AnimalModel(BaseModel):
name: str
type: str
age: int
llm = ChatOpenAI(...)
structured_llm = llm.with_structured_output(AnimalModel)
resp = structured_llm.invoke("some prompt")
animal = AnimalModel.model_validate(resp)
这里大模型的输出是满足 AnimalModel 结构的定义的,即打印 resp 会得到形如这样的 dict:
{ name: xxx, type: yyy, age: 123 }
原理
首先,在得到结果的每一个 token 时,大模型实际输出了所有 token 在当前文本位置的概率。
而结构化输出必然使得某些文本位置上,只能输出固定的 token。比如 json 的第一个字符得是 {
或 [
。
所以简单而言,只需将当前位置不可能出现的 token 概率置零,其他概率重新 softmax,便能实现可靠的结构化。
至于如何得到当前位置可能的 token 集合,使用编译器前端的思想即可。具体请移步编译原理。
如何增加 thinking
一些模型在给出回答前会有思考阶段。使用了 guided decoding 之后,模型就不会思考了,而是按给定的结构进行输出,导致模型能力大幅下降。
解决方法是将思考部分引入结构。以上面 Animal 为例:
class AnimalWithThinking(BaseModel):
thought: str
result: AnimalModel
llm_with_thinking = llm.with_structured_output(AnimalWithThinking)
...
模型会在 thought 中完成思考,在 result 中得到 Animal 结构化的结果。