指导#
Guidance 是微软开发的用于控制大型语言模型的指导语言。
指导程序允许您将生成、提示和逻辑控制交织在一起,形成一个连续的流程,与语言模型实际处理文本的方式相匹配。
结构化输出#
指导的一个特别令人兴奋的方面是能够输出结构化对象(比如遵循特定模式的 JSON,或者 pydantic 对象)。与其仅仅“建议”期望的输出结构给语言模型,指导实际上可以“强制”语言模型的输出遵循期望的模式。这使得语言模型可以专注于内容而非语法,并且完全消除了输出解析问题的可能性。
这对于参数较少、未经充分源代码数据训练的较弱语言模型尤为强大,这些模型可能无法可靠地生成格式良好、层次结构清晰的结构化输出。
创建一个用于生成 pydantic 对象的指导程序#
在 LlamaIndex 中,我们提供了与指导的初始集成,以便轻松生成结构化输出(更具体地说是 pydantic 对象)。
例如,如果我们想要生成一张包含以下模式的歌曲专辑:
class Song(BaseModel):
title: str
length_seconds: int
class Album(BaseModel):
name: str
artist: str
songs: List[Song]
只需创建一个 GuidancePydanticProgram
,指定我们期望的 pydantic 类 Album
,并提供一个合适的提示模板。
注意:指导使用句柄样式模板,使用双大括号进行变量替换,使用单大括号表示文字大括号。这与 Python 格式化字符串的约定相反。
从 LlamaIndex 的核心提示指导工具中导入 convert_to_handlebars
,它可以将 Python 格式化字符串样式模板转换为指导句柄样式模板。
program = GuidancePydanticProgram(
output_cls=Album,
prompt_template_str="生成一个示例专辑,包括一位艺术家和一组歌曲。以电影 {{movie_name}} 作为灵感",
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),
],
)
您可以在此笔记本中了解更多详情。
使用指导改进我们的子问题查询引擎的鲁棒性#
LlamaIndex 提供了一套高级查询引擎工具包,用于解决不同的用例。其中一些依赖于中间步骤的结构化输出。 我们可以使用指导来提高这些查询引擎的鲁棒性,确保中间响应具有预期的结构(以便可以正确解析为结构化对象)。
例如,我们实现了一个 GuidanceQuestionGenerator
,可以插入到 SubQuestionQueryEngine
中,使其比使用默认设置更加鲁棒。
from llama_index.question_gen.guidance import GuidanceQuestionGenerator
from guidance.llms import OpenAI as GuidanceOpenAI
# 定义基于指导的问题生成器
question_gen = GuidanceQuestionGenerator.from_defaults(
guidance_llm=GuidanceOpenAI("text-davinci-003"), verbose=False
)
# 定义查询引擎工具
query_engine_tools = ...
# 构建子问题查询引擎
s_engine = SubQuestionQueryEngine.from_defaults(
question_gen=question_gen, # 使用上述基于指导的 question_gen
query_engine_tools=query_engine_tools,
)
请参阅此笔记本以了解更多详情。