LlamaIndex 组件 - Prompts

文章目录


一、关于 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=...)

注意:您可能会看到对旧提示子类的引用,例如QuestionAnswerPromptRefinePrompt

这些已被弃用(现在是 的类型别名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_templaterefine_template

  • text_qa_template- 用于使用检索到的节点获取查询的初始答案
  • refine_template- 当检索到的文本不适合使用response_mode="compact"(默认)的单个 LLM 调用时,或者使用 检索多个节点时使用response_mode="refine"
    第一个查询的答案作为 插入existing_answer,LLM 必须根据新上下文更新或重复现有答案。

2.2 访问提示

您可以调用get_promptsLlamaIndex 中的许多模块来获取模块和嵌套子模块中使用的提示的平面列表。

例如,看一下下面的代码片段。

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_promptsupdate_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(一)

相关推荐
都叫我大帅哥11 小时前
🚀 LangGraph终极指南:从入门到生产级AI工作流编排
python·langchain
showyoui12 小时前
LangChain vs LangGraph:从困惑到清晰的认知之路(扫盲篇)
langchain·ai编程
_一条咸鱼_17 小时前
LangChain记忆序列化与持久化方案源码级分析(37)
人工智能·面试·langchain
数据智能老司机17 小时前
构建由 LLM 驱动的 Neo4j 应用程序——揭开 RAG 的神秘面纱
langchain·llm·aigc
数据智能老司机17 小时前
构建由 LLM 驱动的 Neo4j 应用程序——构建智能应用的知识图谱基础理解
langchain·llm·aigc
数据智能老司机17 小时前
构建由 LLM 驱动的 Neo4j 应用程序——使用电影数据集构建你的Neo4j图数据库
langchain·llm·aigc
数据智能老司机19 小时前
构建由 LLM 驱动的 Neo4j 应用程序——LLM、RAG 与 Neo4j 知识图谱简介
langchain·llm·aigc
ClouGence2 天前
RAG 青铜升级:知识库召回率优化实战攻略
后端·langchain
老周聊大模型2 天前
大模型如何突破“认知茧房”?RAG+MCP构建外部脑接口
langchain·agent·mcp
小森( ﹡ˆoˆ﹡ )2 天前
LangChain聊天机器人教程
大数据·langchain·机器人