如何与大模型交互?从提示词工程到RAG
目录
提示词介绍
回顾上节内容什么是AI?我们提到生成式AI输出的内容可能会出现AI幻觉,即输出结果有时会偏离我们的实际需求。那么为了保证AI模型能够充分理解我们的意图,就需要构造清晰恰当的提示词(Prompt)作为指令交给模型完成任务。可以说,提示词就是我们和大模型交互的唯一方式。
提示词的内容
一般提示词的内容包含 身份设定,背景设定,参考资料,样例,指令,限制条件等
提示词的分类
提示词一般可分为系统提示词(System Prompt)和用户提示词(Usr Prompt)
系统提示词:是预先设置好的全局指令,在对话一开始就交给AI模型,整个会话生效。用来定义用户是谁、遵守什么规则、回答风格、禁止做什么。不会随着每轮对话消失,会持续约束AI模型。
用户提示词:是用户每一轮输入的内容,每一条用户消息都属于用户提示词,用来下达具体任务。
AI模型接收到系统提示词 + 用户提示词,结合两者生成回复。
提示词工程
大模型本身不用改动、不用重新训练,只靠调整输入的指令文字,就能提升输出质量,这套思路和技巧就是提示词工程。简单讲就是专门研究怎么设计、优化提示词,来更好地调动大模型能力的方法。为了让 AI 准确读懂你的意图,减少幻觉,输出符合要求的内容。除了在提示词中精准的设定和限制外,给出样例和设置参考资料也会对AI模型的输出产生较大影响。
1)N-Shot
按照Prompt中样例数量进行分类,如Zero-Shot,One-Shot,Few-Shot。
比如我给大模型一个商品比较任务,
方式一:“请帮我比较一下A商品和B商品”,此时没有给出任何样例,就是Zero-Shot,大模型会给到我一个回答。但是我觉的大模型回答的并不符合我的期待,并没有突出商品的核心亮点,这时我会用方法二:
方式二:“请帮我比较一下A商品和B商品,优秀回答样例1:XXX,优秀回答样例2:XXX...”,此时给出几个样例,就是N-Shot.如Three-Shot,Five-Shot,Many-Shot等等,大模型给出的回答就会参考样例,给出比较符合我们期待的回答。
这种方法其实是非常常见的,且对于大模型做任务是有非常大的影响的一种做法。但是如果我们的模型稍微复杂些,我们需要给到较多的资料和样例(这些都是需要人工收集 + 梳理)。然而提示词都有字数限制的,如果提示词内容过多,就会导致性能下降,即有时你明明在提示词里面塞了一些很重要的参考资料,大语言模型在回答用户问题的时候,就好像没看到这些参考资料一样,随便回答。既然我们没有办法把所有的知识都给它塞到提示词里面。所以要额外去做一个知识库,这样能方便我们需要的时候能去知识库里面找到有用的信息。
2)提示词的改写
用户提出的问题往往是口语化的、承接上下文的、模糊的,甚至是包含了情绪的。提示词是我们和大模型交互的唯一方式。如果第一步“检索”就走偏了,那么后续的“生成”质量也会降低。 因此需要一个翻译官的角色,将用户的“口语化查询”转换成“书面化、精确的检索语句”。
目前我们有三种改写方式:
1)自己主动做,用提示词的方式引导大模型改写提示词
先去识别Query是哪种类型,然后去拼接提示词。输出改写后的提示词
"""自动识别Query类型并进行改写"""
instruction = """
你是一个智能的查询分析专家。请分析用户的查询,识别其属于以下哪种类型:
1. 上下文依赖型 - 包含"还有"、"其他"等需要上下文理解的词汇
2. 对比型 - 包含"哪个"、"比较"、"更"、"哪个更好"、"哪个更"等比较词汇
3. 模糊指代型 - 包含"它"、"他们"、"都"、"这个"等指代词
4. 多意图型 - 包含多个独立问题,用"、"或"?"分隔
5. 反问型 - 包含"不会"、"难道"等反问语气
说明:如果同时存在多意图型、模糊指代型,优先级为多意图型>模糊指代型
请返回JSON格式的结果:
{
"query_type": "查询类型",
"rewritten_query": "改写后的查询",
"confidence": "置信度(0-1)"
}
#----------------------------------------------------
"""上下文依赖型Query改写"""
instruction = """
你是一个智能的查询优化助手。请分析用户的当前问题以及前序对话历史,判断当前问题是否依赖于上下文。
如果依赖,请将当前问题改写成一个独立的、包含所有必要上下文信息的完整问题。
如果不依赖,直接返回原问题。
"""
#----------------------------------------------------
"""对比型Query改写"""
instruction = """
你是一个查询分析专家。请分析用户的输入和相关的对话上下文,识别出问题中需要进行比较的多个对象。
然后,将原始问题改写成一个更明确、更适合在知识库中检索的对比性查询。
"""
#----------------------------------------------------
"""模糊指代型Query改写"""
instruction = """
你是一个消除语言歧义的专家。请分析用户的当前问题和对话历史,找出问题中 "都"、"它"、"这个" 等模糊指代词具体指向的对象。
然后,将这些指代词替换为明确的对象名称,生成一个清晰、无歧义的新问题。
"""
#----------------------------------------------------
"""多意图型Query改写 - 分解查询"""
instruction = """
你是一个任务分解机器人。请将用户的复杂问题分解成多个独立的、可以单独回答的简单问题。以JSON数组格式输出。
"""
#----------------------------------------------------
"""反问型Query改写"""
instruction = """
你是一个沟通理解大师。请分析用户的反问或带有情绪的陈述,识别其背后真实的意图和问题。
然后,将这个反问改写成一个中立、客观、可以直接用于知识库检索的问题。
"""
2)Agent内置模块去做Query改写
3)有些大模型有思考模式
如果需要调用工具,如联网工具,可以使用Agent去调用:Agent调用工具
3)RAG
RAG(Retrieval-Augmented Generation)增强检索生成,简单来说,就是先检索再生成。
在回答用户的问题之前,先做一轮内部的知识搜索即检索。然后找到一些找到一些比较有价值的内部的信息和知识之后,再参考着这些知识去生成问题的答案。RAG有如下的优势:
• 解决知识时效性问题:大模型的训练数据通常是静态的,无法涵盖最新信息,而RAG可以检索外部知识库实时更新信息。
• 减少模型幻觉:通过引入外部知识,RAG能够减少模型生成虚假或不准确内容的可能性。
• 提升专业领域回答质量:RAG能够结合垂直领域的专业知识库,生成更具专业深度的回答
在大语言模型中,RAG已经是非常基础的一个工作,也是大部分AI agent或者大部分AI应用都具备的一项功能。RAG包含两个步骤:1.构建知识库;2.调用 请参照RAG的工作流程与目标。
扩展:In Context Learning
大语言模型在回答问题时,会参考到我们给出的参考资料或者优秀样例,就好像是学会了一样,这种能力叫做In Context Learning。但其实大模型是无状态的,没有任何记忆,所以我们提供的资料只在这一次回答时有效,大模型没有学到任何知识,更不会内化到大语言模型的内部。
更多推荐

所有评论(0)