学习了解什么是提示词工程、MCP、RAG

一、提示词工程
1、什么是提示词工程(prompt engineering)?

简单的来说,提词器工程是一种不需要调整大模型和权重就可以获取某种结果的方法。主要用于文本生成,问答系统或者是其他场景,它的作用和应用场景都比较广泛。

同一个需求,如果提示词不一样,所生成的结果也有可能会有很大的差别。学好提示词,可以使我们更好的使用和操作大模型,得到更好的结果。提示词作为一种辅助手段,让大模型更好地理解人类的问题。

提示词工程的作用是为了让大模型给出更加准确的输出,而提示词的表现形式可以是任何形式,可以是一个问题,一段对话,一段描述等任何文本形式。

2、怎么才能写出一个更好的提示词?

一个好的提示词应该包含以下几个部分:

  1. 任务: 任务序列是由动词引导的,例如generate, drive, write等,而且需要明确任务目标;
  2. 上下文: 一般要描述什么是用户的背景信息,成功的结果希望是什么样子,以及他们处于怎样的环境中;
  3. 示例: 在所有语言模型研究表明,在提示词中包含例子都将产生更加高质量的答案;
  4. 角色: 这是你希望人工智能所扮演的角色。想象一下你有一个问题,想咨询专家来解决这些疑问。例如,你在找工作的时候可以让大模型扮演一个面试官;在买车的时候,让大模型扮演一个具有多年经验的汽车销售等
  5. 格式: 想象一下实现的目标,可以是个人或团体的目标,比如找到工作、成为一位优秀的演讲者等。所有这些都是零散的想法,但借助人工智能的帮助,可以将它们整理成一个特定的格式,比如一个表格。我们也可以希望得到电子邮件、要点、代码块等格式。这些格式对我们的工作也很有用,例如段落和标记。
  6. 语气: 如果正确衡量要使用的音调类型,"语气"者一个元素就很容易理解。

在这6大要素中,任务是必须的,上下文和示例非常重要,而且最好也要有角色、格式和语气。

3、具体示例

设置提示词:

js 复制代码
请列出Python编程语言的五个主要优点,并简要解释每一个优点。

测试输出:

js 复制代码
1. 易于学习和使用:Python具有简单的语法,使初学者能够快速上手编程。 
2. 广泛的库支持:拥有大量功能强大的库,可以简化复杂任务的开发。 
3. 跨平台兼容性:Python可以在不同操作系统上运行,提供了灵活性。 
4. 强大的社区支持:活跃的社区提供了大量资源和帮助支持。 
5. 快速开发:Python的简洁和高效使得开发者能够快速迭代作品。
二、MCP
1、什么是## MCP(Model Context Protocol)?

MCP(Model Context Protocol,模型上下文协议) ,2024年11月底,由 Anthropic 推出的一种开放标准,旨在统一大型语言模型(LLM)与外部数据源和工具之间的通信协议。MCP 的主要目的在于解决当前 AI 模型因数据孤岛限制而无法充分发挥潜力的难题,MCP 使得 AI 应用能够安全地访问和操作本地及远程数据,为 AI 应用提供了连接万物的接口。

在过去,为了让大模型和其他AI应用使用我们的数据,我们往往需要通过复制粘贴或上传下载等繁琐的方法。这些方法不仅麻烦,还导致了数据隔离,使得即使是最强大的模型也成为信息孤岛。为了构建更加强大的模型,每一个新的数据源都需要进行重新定制实现,这使得真正互联的系统在扩展方面面临诸多限制。

如今,MCP 技术能够在 AI 和数据(包括本地数据及互联网数据)之间搭建桥梁。通过 MCP 服务器和 MCP 客户端,只要遵循这套协议,就可以实现"万物互联"。

借助 MCP,我们能够将数据和文件系统、开发工具、网络及浏览器自动化、生产力工具、通信工具以及各种社区生态能力整合在一起,释放出强大的协作能力,展现了不可估量的价值。

2、数据安全性

理想的"万物互联"生态系统无疑令人向往,但一个普遍的担忧是通过 MCP 服务器可能导致数据泄露或非法访问。对此,MCP进行了深入的考虑。它通过标准化的数据访问接口,减少直接接触敏感数据的必要环节,从而降低数据泄露的风险。此外,MCP内置了安全机制,确保只有经过验证的请求才能访问特定资源,相当于为数据安全增加了一道额外防线。

MCP协议还支持多种加密算法,保证数据在传输过程中的安全性。例如,MCP服务器能够自身管理资源,因此无需将API密钥等敏感信息提供给大型语言模型(LLM)提供商。即使LLM提供商遭受攻击,攻击者也无法获取这些敏感信息。

然而,MCP这套协议或标准需要大家共同参与建设,才能形成一个繁荣的生态。目前仍处于测试阶段,随着发展,必然会涌现出更多的问题。

3、工作原理
  • 初始化连接:客户端向服务器发送连接请求,建立通信通道。
  • 发送请求:客户端根据需求构建请求消息,并发送给服务器。
  • 处理请求:服务器接收到请求后,解析请求内容,执行相应的操作(如查询数据库、读取文件等)。
  • 返回结果:服务器将处理结果封装成响应消息,发送回客户端。
  • 断开连接:任务完成后,客户端可以主动关闭连接或等待服务器超时关闭。
三、RAG

RAG 检索增强生成(Retrieval Augmented Generation),就是通过自有垂域数据库检索相关信息,然后合并成为提示模板,给大模型润色生成回答。 当将大模型应用于实际业务场景时,发现通用基础大模型难以满足实际需求,主要有以下原因:

  1. 知识局限性:大模型的知识来源于其训练数据,通常是网络公开数据。对于实时、非公开或离线数据,模型无法访问和处理。
  2. 幻觉问题:由于AI模型基于数学概率,其输出是数值运算结果,可能出现不准确或错误的内容,尤其当模型在某些知识领域不具备足够信息时。
  3. 数据安全性:企业关注数据安全,不愿冒数据泄露风险。因此,将私域数据上传至第三方平台进行训练并不划算,需在数据安全与效果之间权衡。

例如,向 LLM 提问一个问题(qustion),RAG 从各种数据源检索相关的信息,并将检索到的信息和问题(answer)注入到 LLM 提示中,LLM 最后给出答案。

RAG架构

完整的RAG应用流程主要包含两个阶段:

  • 数据准备阶段:数据提取------>文本分割------>向量化(embedding)------>数据入库
  • 应用阶段:用户提问------>数据检索(召回)------>注入Prompt------>LLM生成答案
数据准备阶段

数据准备一般是一个离线的过程,主要是将私域数据向量化后构建索引并存入数据库的过程。

  • 数据提取
    • 数据加载:包括多格式数据加载、不同数据源获取等,根据数据自身情况,将数据处理为同一个范式。
    • 数据处理:包括数据过滤、压缩、格式化等。
    • 元数据获取:提取数据中关键信息,例如文件名、Title、时间等 。
  • 文本分割
    • 句分割:以"句"的粒度进行切分,保留一个句子的完整语义。常见切分符包括:句号、感叹号、问号、换行符等。
    • 固定长度分割:根据embedding模型的token长度限制,将文本分割为固定长度(例如256/512个tokens),这种切分方式会损失很多语义信息,一般通过在头尾增加一定冗余量来缓解。
  • 向量化:向量化是一个将文本数据转化为向量矩阵的过程,该过程会直接影响到后续检索的效果。
  • 数据入库:据向量化后构建索引,并写入数据库的过程可以概述为数据入库过程。
应用阶段

在应用阶段,可以根据用户的提问,通过高效的检索方法,召回与提问最相关的知识,并融入Prompt;大模型参考当前提问和相关知识,生成相应的答案。

  • 数据检索

常见的数据检索方法包括:相似性检索、全文检索等,根据检索效果,一般可以选择多种检索方式融合,提升召回率。

(1)相似性检索:即计算查询向量与所有存储向量的相似性得分,返回得分高的记录。常见的相似性计算方法包括:余弦相似性、欧氏距离、曼哈顿距离等。

(2)全文检索:全文检索是一种比较经典的检索方式,在数据存入时,通过关键词构建倒排索引;在检索时,通过关键词进行全文检索,找到对应的记录。

  • 注入Prompt:Prompt作为大模型的直接输入,是影响模型输出准确率的关键因素之一。
高级RAG
  • 分块 & 向量化:首先需要为文档内容创建向量索引,然后在运行时搜索与查询向量余弦距离最近的向量索引,这样就可以找到与查询内容最接近语义的文档

  • 搜索索引:1)向量存储索引:RAG 管道的关键部分是搜索索引,它存储了在上一步中获得的向量化内容。最原始的实现是使用平面索引 --- 查询向量和所有块向量之间的暴力计算距离。2)分层索引:在大型数据库的情况下,一个有效的方法是创建两个索引------一个由摘要组成,另一个由文档块组成,然后分两步进行搜索,首先通过摘要过滤掉相关文档,然后只在这个相关组内搜索。

  • 重排和过滤:在 LlamaIndex 中,检索结果已经通过不同算法获得,现在我们需要通过过滤、重新排序或者进行一些转换来优化这些结果。在这一阶段,有各种后处理器可以使用,如根据相似性分数、关键字或元数据进行结果过滤,或者利用其他模型(比如 LLM)、sentence-transformer 交叉编码器、Cohere 重新排名接口来重新排序结果。这是最终将检索到的上下文提供给 LLM以生成答案之前的关键步骤。

  • 查询转换:大语言模型可以将复杂的查询拆分为多个子查询,从而更好地处理。例如,当你询问"在 大众点评上 上,海底捞 和 半天妖 哪个更受欢迎?"时,直接找到比较结果可能不太现实。因此,可以将这个问题拆分成两个更简单且具体的子查询:

    • "海底捞 在 大众点评 上有多少星?"
    • "半天妖 在 大众点评 上有多少星?"

    这些子查询可以并行执行,检索到的信息会整合到一个LLM的提示词中。在Langchain中,这个功能实现为多查询检索器,而在LlamaIndex中则为子问题查询引擎。 此外,Step-back prompting技术让LLM生成更一般的查询,以获取较为广泛或高级的上下文,用于回答原始查询。同时,也执行原始查询的检索,并在生成最终答案时,将两个上下文一起传递给LLM。LangChain对此有一个示例实现。 查询重写通过使用LLM对初始查询进行重新表述,以优化检索效果。LangChain和LlamaIndex都实现了这一功能,其中个人认为LlamaIndex的解决方案表现更为强大。

  • 聊天引擎:构建一个能够反复用于单个查询的理想RAG系统的重要一步是实现聊天逻辑。在这方面,我们需要像传统聊天机器人一样考虑对话上下文,以支持后续问题、代词指代或者与前一个对话有关的任何用户命令。这可以通过查询压缩技术来解决,该技术将聊天上下文与用户查询一并纳入考虑。 常用的一种方法是使用ContextChatEngine进行上下文压缩,它首先检索与用户查询相关的上下文,然后将这些信息与内存缓冲区中的聊天记录一起发送给LLM。这使得LLM在生成下一个答案时能够理解前一个上下文。

  • 查询路由:查询路由是 LLM 驱动的决策步骤,决定在给定用户查询的情况下下一步该做什么

  • 智能体:智能体几乎从第一个 LLM API 发布开始就已经存在------这个思路是为一个具备推理能力的 LLM 提供一套工具和一个要完成的任务。这些工具可能包括一些确定性功能,如任何代码函数或外部 API,甚至是其他智能体------这种 LLM 链接思想是 LangChain 得名的地方。

  • 响应合成:这是任何 RAG 管道的最后一步------根据检索的所有上下文和初始用户查询生成答案。最简单的方法是将所有获取的上下文(高于某个相关性阈值)与查询一起连接并提供给 LLM。但是,与往常一样,还有其他更复杂的选项,涉及多个 LLM 调用,以优化检索到的上下文并生成更好的答案。

    响应合成的主要方法有:

    • 通过将检索到的上下文逐块发送到 LLM 来优化答案
    • 概括检索到的上下文,以适应提示
    • 根据不同的上下文块生成多个答案,然后将它们连接或概括起来。
相关推荐
Senar2 小时前
如何判断浏览器是否开启硬件加速
前端·javascript·数据可视化
HtwHUAT2 小时前
实验四 Java图形界面与事件处理
开发语言·前端·python
利刃之灵2 小时前
01-初识前端
前端
codingandsleeping2 小时前
一个简易版无缝轮播图的实现思路
前端·javascript·css
天天扭码2 小时前
一分钟解决 | 高频面试算法题——最大子数组之和
前端·算法·面试
全宝3 小时前
🌏【cesium系列】01.vue3+vite集成Cesium
前端·gis·cesium
拉不动的猪4 小时前
简单回顾下插槽透传
前端·javascript·面试
烛阴4 小时前
Fragment Shader--一行代码让屏幕瞬间变黄
前端·webgl
爱吃鱼的锅包肉4 小时前
Flutter路由模块化管理方案
前端·javascript·flutter
风清扬雨4 小时前
Vue3具名插槽用法全解——从零到一的详细指南
前端·javascript·vue.js