跳到内容

Guidance#

Guidance 是 Microsoft 开发的一种用于控制大型语言模型的指导语言。

Guidance 程序允许您将生成、提示和逻辑控制交错在一个连续的流程中,与语言模型实际处理文本的方式相匹配。

结构化输出#

Guidance 一个特别令人兴奋的方面是能够输出结构化对象(例如遵循特定模式的 JSON,或 pydantic 对象)。Guidance 不仅仅是向 LLM“建议”所需的输出结构,而是可以实际“强制”LLM 的输出遵循所需的模式。这使得 LLM 可以专注于内容而不是语法,并且完全消除了输出解析问题的可能性。

这对于参数数量较少、并且未在足够的源代码数据上进行训练而无法可靠地生成格式良好、分层的结构化输出的较弱 LLM 尤其强大。

创建生成 pydantic 对象的 Guidance 程序#

在 LlamaIndex 中,我们提供了与 guidance 的初步集成,使得生成结构化输出(更具体地说,pydantic 对象)变得非常容易。

例如,如果我们想生成一个包含歌曲的专辑,其模式如下

class Song(BaseModel):
    title: str
    length_seconds: int


class Album(BaseModel):
    name: str
    artist: str
    songs: List[Song]

这就像创建一个 GuidancePydanticProgram,指定我们想要的 pydantic 类 Album,并提供一个合适的提示模板一样简单。

注意:guidance 使用 handlebars 风格的模板,其中双大括号用于变量替换,而单大括号用于字面大括号。这与 Python 格式化字符串的约定相反。

from llama_index.core.prompts.guidance_utils import convert_to_handlebars`,它可以将 Python 格式化字符串风格的模板转换为 guidance handlebars 风格的模板。

program = GuidancePydanticProgram(
    output_cls=Album,
    prompt_template_str="Generate an example album, with an artist and a list of songs. Using the movie {{movie_name}} as inspiration",
    guidance_llm=OpenAI("text-davinci-003"),
    verbose=True,
)

现在我们可以通过使用额外的用户输入调用程序来运行它。这里我们来点怪诞的东西,创建一个受《闪灵》启发的专辑。

output = program(movie_name="The Shining")

我们有了 pydantic 对象

Album(
    name="The Shining",
    artist="Jack Torrance",
    songs=[
        Song(title="All Work and No Play", length_seconds=180),
        Song(title="The Overlook Hotel", length_seconds=240),
        Song(title="The Shining", length_seconds=210),
    ],
)

您可以试用 此 Notebook 以获取更多详细信息。

使用 guidance 提高子问题查询引擎的鲁棒性。#

LlamaIndex 提供了一套用于解决不同用例的高级查询引擎工具包。其中一些在中间步骤依赖于结构化输出。我们可以使用 guidance 来提高这些查询引擎的鲁棒性,确保中间响应具有预期的结构(以便它们可以正确解析为结构化对象)。

作为一个示例,我们实现了一个 GuidanceQuestionGenerator,它可以插入到 SubQuestionQueryEngine 中,使其比使用默认设置更具鲁棒性。

from llama_index.question_gen.guidance import GuidanceQuestionGenerator
from guidance.llms import OpenAI as GuidanceOpenAI

# define guidance based question generator
question_gen = GuidanceQuestionGenerator.from_defaults(
    guidance_llm=GuidanceOpenAI("text-davinci-003"), verbose=False
)

# define query engine tools
query_engine_tools = ...

# construct sub-question query engine
s_engine = SubQuestionQueryEngine.from_defaults(
    question_gen=question_gen,  # use guidance based question_gen defined above
    query_engine_tools=query_engine_tools,
)

请参阅 此 Notebook 以获取更多详细信息。