当前位置: 首页 > article >正文

LlamaIndex框架学习-提示词的几种使用模式

定义自定义提示词

定义自定义提示词就像创建格式字符串一样简单。

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})。

您还可以从聊天消息中定义模板

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=...)

获取和设置自定义提示词

由于 LlamaIndex 是一个多步骤管道,因此确定要修改的操作并在正确的位置传递自定义提示非常重要。

例如,提示用于响应合成器、检索器、索引构建等;其中一些模块嵌套在其他模块中(合成器嵌套在查询引擎中)。

有关访问/自定义提示的完整详细信息,请参阅本指南。

常用提示

最常用的提示是text_qa_templaterefine_template

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

访问提示

您可以在LlamaIndex中的许多模块上调用get_prompts,以获得模块和嵌套子模块中使用的提示符的扁平列表。

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

query_engine = index.as_query_engine(response_mode="compact")
prompts_dict = query_engine.get_prompts()
print(list(prompts_dict.keys()))

您可能会取回以下密钥:

['response_synthesizer:text_qa_template', 'response_synthesizer:refine_template']

请注意,提示以其子模块作为前缀“命名空间”。

更新提示

您可以在任何get_prompts使用该update_prompts函数实现的模块上自定义提示。只需传入参数值,其键等于通过 获取的提示字典中的键get_prompts

例如,对于上面的例子,我们可以做以下事情

# 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}
)

修改查询引擎中使用的提示

对于查询引擎,您还可以在查询时直接传递自定义提示(即针对索引执行查询并合成最终响应)。

还有两种等效的方法来覆盖提示词:

  • 通过高级 API
query_engine = index.as_query_engine(
    text_qa_template=custom_qa_prompt, refine_template=custom_refine_prompt
)
  • 通过低级组合 API
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 进行更精细的控制。

有关哪些类使用哪些提示的详细信息,请访问 查询类参考。

请查看参考文档以获取所有提示的完整列表。

修改索引构建中使用的提示

一些索引在构建过程中使用不同类型的提示(注意:最常见的VectorStoreIndexSummaryIndex,不使用任何提示)。

例如,TreeIndex使用摘要提示对节点进行分层总结,KeywordTableIndex使用关键字提取提示提取关键字。

有两种等效方法可以覆盖提示:

  • 通过默认节点构造函数
index = TreeIndex(nodes, summary_template=custom_prompt)
  • 通过文档构造函数。
index = TreeIndex.from_documents(docs, summary_template=custom_prompt)

有关哪个索引使用哪个提示的详细信息,请访问 索引类参考。

高级提示功能

在本节中,我们展示了 LlamaIndex 中的一些高级提示功能。

相关指南:

  • 高级提示
  • 为 RAG 提供快速工程

部分格式化

部分格式化提示,填写一些变量,同时将其他变量留待以后填写。

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")

模板变量映射

LlamaIndex 提示抽象通常需要某些键。例如,我们的text_qa_prompt 需要 context_str 变量作为上下文和 query_str变量作为用户查询输入。

但是如果您尝试调整字符串模板以用于 LlamaIndex ,更改模板变量可能会很烦人。

相反,定义 template_var_mappings

template_var_mappings = {"context_str": "my_context", "query_str": "my_query"}

prompt_tmpl = PromptTemplate(
    qa_prompt_tmpl_str, template_var_mappings=template_var_mappings
)

函数映射

将函数作为模板变量传递,而不是固定的值。

这非常高级且功能强大;允许您进行动态的少量示例提示等。

以下是一个重新格式化 context_str 的例子。

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")

http://www.kler.cn/a/379184.html

相关文章:

  • 十四届蓝桥杯STEMA考试Python真题试卷第二套第五题
  • 运维工具之docker入门
  • c语言 变量类型总结
  • Go语言常见数据结构实现原理
  • 【学习】软件测试中的过程管理为何如此重要
  • 上市公司环境信息披露质量评分数据王婉菁版(2008-2023年)噪声光污染辐射废水减排等治理
  • JVM1.8内存模型
  • 力扣每日一题 3165. 不包含相邻元素的子序列的最大和
  • MySQL存储引擎——针对实习面试
  • 海康视频不能在浏览器解析播放,需要转码
  • 链表详解(三)
  • mmpretrainmmdetection环境配置
  • 高并发场景下的性能测试方法!
  • ethers.js 创建钱包,导入助记词,导入私钥)
  • 浅析Android Handler机制实现原理
  • ssm037物流管理系统设计与实现+jsp(论文+源码)_kaic
  • 克服奖励欺骗:Meta发布全新后训练方式CGPO,编程水平直升5%,打破RLHF瓶颈
  • [linux驱动开发--零碎知识]基于linux内核6.11.0
  • C++笔试题之实现一个定时器
  • [JAVAEE] 面试题(三) - Callable接口, ReentrantLock类, Semaphore信号量, CountDownLatch类
  • 在线教育辅助:SpringBoot试题库系统精讲
  • Android IPC机制(一)多进程模式
  • 每周算法比赛
  • qt 如何在本地进行打包
  • 【论文精读】LPT: Long-tailed prompt tuning for image classification
  • 读书笔记-《Spring技术内幕》(四)事务