文章目录
-
- [一、关于 Prompts](#一、关于 Prompts)
- 二、使用模式
-
- 1、定义自定义提示
- 2、获取和设置自定义提示
-
- [2.1 常用提示](#2.1 常用提示)
- [2.2 访问提示](#2.2 访问提示)
- [2.3 更新提示](#2.3 更新提示)
- [2.4 修改查询引擎中使用的提示](#2.4 修改查询引擎中使用的提示)
- [2.5 修改索引构建中使用的提示](#2.5 修改索引构建中使用的提示)
- 3、[高级]高级提示功能
-
- [3.1 部分格式化](#3.1 部分格式化)
- [3.2 模板变量映射](#3.2 模板变量映射)
- [3.3 函数映射](#3.3 函数映射)
一、关于 Prompts
1、概念
提示是赋予LLM 表达能力的基本输入。
LlamaIndex 使用提示来构建索引、执行插入、在查询期间执行遍历并合成最终答案。
LlamaIndex 使用一组开箱即用的默认提示模板。
此外,还有一些专门为聊天模型编写和使用的提示,如下gpt-3.5-turbo
所示。
用户还可以提供自己的提示模板来进一步定制框架的行为。
自定义的最佳方法是从上面的链接 复制默认提示,并将其用作任何修改的基础。
2、使用模式概览
使用提示很简单。
python
from llama_index.core import PromptTemplate
template = (
"We have provided context information below. \n"
"---------------------\n"
"{context_str}"
"\n---------------------\n"
"Given this information, please answer the question: {query_str}\n"
)
qa_template = PromptTemplate(template)
# you can create text prompt (for completion API)
prompt = qa_template.format(context_str=..., query_str=...)
# or easily convert to message prompts (for chat API)
messages = qa_template.format_messages(context_str=..., query_str=...)
有关更多详细信息,请参阅下方的 使用模式指南。
3、示例指南
简单的自定义示例
Prompt 工程指南
实验性的
二、使用模式
1、定义自定义提示
定义自定义提示就像 创建格式字符串 一样简单
python
from llama_index.core import PromptTemplate
template = (
"We have provided context information below. \n"
"---------------------\n"
"{context_str}"
"\n---------------------\n"
"Given this information, please answer the question: {query_str}\n"
)
qa_template = PromptTemplate(template)
# you can create text prompt (for completion API)
prompt = qa_template.format(context_str=..., query_str=...)
# or easily convert to message prompts (for chat API)
messages = qa_template.format_messages(context_str=..., query_str=...)
注意:您可能会看到对旧提示子类的引用,例如
QuestionAnswerPrompt
、RefinePrompt
。这些已被弃用(现在是 的类型别名
PromptTemplate
)。现在您可以直接指定
PromptTemplate(template)
构建自定义提示。但在替换默认问题答案提示时,您仍然必须确保模板字符串包含预期的参数(例如
{context_str}
和)。
{query_str}
您还可以根据聊天消息定义模板
python
from llama_index.core import ChatPromptTemplate
from llama_index.core.llms import ChatMessage, MessageRole
message_templates = [
ChatMessage(content="You are an expert system.", role=MessageRole.SYSTEM),
ChatMessage(
content="Generate a short story about {topic}",
role=MessageRole.USER,
),
]
chat_template = ChatPromptTemplate(message_templates=message_templates)
# you can create message prompts (for chat API)
messages = chat_template.format_messages(topic=...)
# or easily convert to text prompt (for completion API)
prompt = chat_template.format(topic=...)
2、获取和设置自定义提示
由于 LlamaIndex 是一个多步骤管道,因此确定要修改的操作并在正确的位置传递自定义提示非常重要。
例如,提示用于响应合成器、检索器、索引构建等;其中一些模块嵌套在其他模块中(合成器嵌套在查询引擎中)。
有关访问/自定义提示的完整详细信息,请参阅本指南 。
2.1 常用提示
最常用的提示是text_qa_template
和refine_template
。
text_qa_template
- 用于使用检索到的节点获取查询的初始答案refine_template
- 当检索到的文本不适合使用response_mode="compact"
(默认)的单个 LLM 调用时,或者使用 检索多个节点时使用response_mode="refine"
。
第一个查询的答案作为 插入existing_answer
,LLM 必须根据新上下文更新或重复现有答案。
2.2 访问提示
您可以调用get_prompts
LlamaIndex 中的许多模块来获取模块和嵌套子模块中使用的提示的平面列表。
例如,看一下下面的代码片段。
python
query_engine = index.as_query_engine(response_mode="compact")
prompts_dict = query_engine.get_prompts()
print(list(prompts_dict.keys()))
您可能会取回以下密钥:
python
['response_synthesizer:text_qa_template', 'response_synthesizer:refine_template']
请注意,提示的子模块前缀为"命名空间"。
2.3 更新提示
您可以在任何实现get_prompts
该update_prompts
功能的模块上自定义提示。
只需传入参数值,其键等于您在通过 获得的提示字典中看到的键get_prompts
。
例如,对于上面的示例,我们可以执行以下操作
python
# shakespeare!
qa_prompt_tmpl_str = (
"Context information is below.\n"
"---------------------\n"
"{context_str}\n"
"---------------------\n"
"Given the context information and not prior knowledge, "
"answer the query in the style of a Shakespeare play.\n"
"Query: {query_str}\n"
"Answer: "
)
qa_prompt_tmpl = PromptTemplate(qa_prompt_tmpl_str)
query_engine.update_prompts(
{"response_synthesizer:text_qa_template": qa_prompt_tmpl}
)
2.4 修改查询引擎中使用的提示
对于查询引擎,您还可以在查询期间直接传入自定义提示(即针对索引执行查询并合成最终响应)。
还有两种等效方法可以覆盖提示:
方式一:通过高级 API
python
query_engine = index.as_query_engine(
text_qa_template=custom_qa_prompt, refine_template=custom_refine_prompt
)
方式二:通过低级组合 API
python
retriever = index.as_retriever()
synth = get_response_synthesizer(
text_qa_template=custom_qa_prompt, refine_template=custom_refine_prompt
)
query_engine = RetrieverQueryEngine(retriever, response_synthesizer)
上面的两种方法是等效的,其中 1 本质上是 2 的语法糖,并隐藏了潜在的复杂性。
您可能希望使用 1 快速修改一些常用参数,并使用 2 进行更精细的控制。
有关哪些类使用哪些提示的更多详细信息,请访问 查询类参考。
查看参考文档以获取完整的所有提示。
2.5 修改索引构建中使用的提示
某些索引在构建过程中使用不同类型的提示(注意 :最常见的提示,VectorStoreIndex
并且SummaryIndex
不要使用任何提示)。
例如,TreeIndex
使用汇总提示对节点进行分层汇总,KeywordTableIndex
使用关键字提取提示来提取关键字。
有两种等效的方法可以覆盖提示:
方式1:通过默认的节点构造函数
python
index = TreeIndex(nodes, summary_template=custom_prompt)
方式2 :通过文档构造函数。
python
index = TreeIndex.from_documents(docs, summary_template=custom_prompt)
有关哪个索引使用哪个提示的更多详细信息,请访问 Index 类参考。
3、[高级]高级提示功能
在本节中,我们将展示 LlamaIndex 中的一些高级提示功能。
相关指南:
3.1 部分格式化
部分格式化提示,填写一些变量,同时留下其他变量稍后填写。
python
from llama_index.core import PromptTemplate
prompt_tmpl_str = "{foo} {bar}"
prompt_tmpl = PromptTemplate(prompt_tmpl_str)
partial_prompt_tmpl = prompt_tmpl.partial_format(foo="abc")
fmt_str = partial_prompt_tmpl.format(bar="def")
3.2 模板变量映射
LlamaIndex 提示抽象通常需要某些键。
例如,我们对上下文和用户查询的text_qa_prompt
期望。
context_str``query_str
但是,如果您尝试调整字符串模板以与 LlamaIndex 一起使用,则更改模板变量可能会很烦人。
相反,定义template_var_mappings
:
python
template_var_mappings = {"context_str": "my_context", "query_str": "my_query"}
prompt_tmpl = PromptTemplate(
qa_prompt_tmpl_str, template_var_mappings=template_var_mappings
)
3.3 函数映射
将函数作为模板变量而不是固定值传递。
这是相当先进和强大的;允许您进行动态几次提示等。
这是重新格式化context_str
.
python
def format_context_fn(**kwargs):
# format context with bullet points
context_list = kwargs["context_str"].split("\n\n")
fmtted_context = "\n\n".join([f"- {c}" for c in context_list])
return fmtted_context
prompt_tmpl = PromptTemplate(
qa_prompt_tmpl_str, function_mappings={"context_str": format_context_fn}
)
prompt_tmpl.format(context_str="context", query_str="query")
2024-04-15(一)