LlamaIndex 组件 - Prompts

2024-04-18 1393阅读

文章目录

    • 一、关于 Prompts
      • 1、概念
      • 2、使用模式概览
      • 3、示例指南
      • 二、使用模式
        • 1、定义自定义提示
        • 2、获取和设置自定义提示
          • 2.1 常用提示
          • 2.2 访问提示
          • 2.3 更新提示
          • 2.4 修改查询引擎中使用的提示
          • 2.5 修改索引构建中使用的提示
          • 3、[高级]高级提示功能
            • 3.1 部分格式化
            • 3.2 模板变量映射
            • 3.3 函数映射

              一、关于 Prompts

              1、概念

              提示是赋予LLM 表达能力的基本输入。

              LlamaIndex 组件 - Prompts
              (图片来源网络,侵删)

              LlamaIndex 使用提示来构建索引、执行插入、在查询期间执行遍历并合成最终答案。

              LlamaIndex 使用一组开箱即用的默认提示模板。

              此外,还有一些专门为聊天模型编写和使用的提示,如下gpt-3.5-turbo 所示。

              用户还可以提供自己的提示模板来进一步定制框架的行为。

              自定义的最佳方法是从上面的链接 复制默认提示,并将其用作任何修改的基础。


              2、使用模式概览

              使用提示很简单。

              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 工程指南

                • 高级提示
                • RAG 提示

                  实验性的

                  • 及时优化
                  • 情绪提示

                    二、使用模式


                    1、定义自定义提示

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

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

                    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_promptsLlamaIndex 中的许多模块来获取模块和嵌套子模块中使用的提示的平面列表。

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

                      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']
                      

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


                      2.3 更新提示

                      您可以在任何实现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}
                      )
                      

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

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

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

                      方式一:通过高级 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 进行更精细的控制。

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

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


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

                      某些索引在构建过程中使用不同类型的提示(注意:最常见的提示,VectorStoreIndex并且SummaryIndex不要使用任何提示)。

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

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


                      方式1:通过默认的节点构造函数

                      index = TreeIndex(nodes, summary_template=custom_prompt)
                      

                      方式2 :通过文档构造函数。

                      index = TreeIndex.from_documents(docs, summary_template=custom_prompt)
                      

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


                      3、[高级]高级提示功能

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

                      相关指南:

                      • 高级提示
                      • RAG 快速工程
                        3.1 部分格式化

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

                        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:

                        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.

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

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]