提示词工程: 大语言模型的Embedding(嵌入和Fine-tuning(微调)
本文是针对这篇文章(https://www.promptengineering.org/master-prompt-engineering-llm-embedding-and-fine-tuning/)的中文翻译,用以详细介绍Embedding(语义嵌入)和Fine Tuning(微调)的概念和比较。
LLM(GPT-3/3.5/4)已经成为一个热门的讨论话题,因为人们寻求利用这种先进的语言模型来实现各种应用,如问答(QA)和信息检索。虽然语义嵌入和微调都是用来适应特定任务的LLM技术,但它们有不同的目的和优势。我们将一起探讨这两个概念,因为它们是相关的,而且经常有关于何时使用哪种技术的困惑。
语义嵌入:表示和应用
语义嵌入是文本的数值向量表示,能够捕捉单词或短语的语义含义。通过比较和分析这些向量,可以辨别文本元素之间的相似性和差异性。利用语义嵌入进行搜索可以快速有效地检索相关信息,特别是在大型数据集中。语义搜索相比微调有几个优势,如更快的搜索速度、降低计算成本以及防止杜撰或事实捏造。由于这些优势,当目标是访问模型中的特定知识时,语义搜索通常是首选。嵌入在各个领域都有应用,包括推荐引擎、搜索功能和文本分类。例如,在为一个流媒体平台设计一个电影推荐引擎时,嵌入可以根据它们的文本描述来识别具有相似主题或类型的电影。通过将这些描述表示为向量,引擎可以计算它们之间的距离,并推荐向量空间中距离较近的电影,确保更准确和相关的用户体验。
微调:提高模型响应
微调是一种用来改善预训练模型性能的技术,如聊天机器人。通过提供示例并调整模型参数,微调使模型能够为特定任务生成更准确和上下文相关的响应。这些任务可以从聊天机器人对话和代码生成到问题形成等不同范围,确保与期望输出更好地对齐。这个过程类似于神经网络在训练过程中调整其权重。例如,在客服聊天机器人中,微调可以提高聊天机器人对行业特定术语或行话的理解,从而更准确和恰当地回答客户询问。作为一种迁移学习形式,微调使预训练模型能够执行新任务,而无需进行大量的重新训练。
LLM嵌入和向量搜索的概述:
嵌入过程是大型语言模型(LLM)如GPT-3/Gpt-3.5/GPT-4的一个重要组成部分,因为它允许以数值格式对文本进行语义理解和表示。以下是LLM嵌入过程的逐步概述的内容:
-
首先,LLM接收一个文本输入,如一个单词或一个句子,并将其分割成一系列的标记(tokens)。标记是文本的最小单位,通常是单个字符或子词。例如,单词“prompt”可以被分割成两个标记:“prom”和“pt”。
-
然后,LLM将每个标记映射到一个嵌入矩阵中的一个向量。嵌入矩阵是一个包含数千个向量的大型表格,每个向量代表一个标记。这些向量的维度通常为768或1024,取决于LLM的大小。例如,“prom”和“pt”的向量可能分别为[0.2, -0.1, 0.3, …]和[-0.4, 0.5, -0.2, …]。
-
接下来,LLM将这些向量相加,得到一个表示整个文本输入的单个向量。这个向量被称为语义嵌入(semantic embedding),因为它捕捉了文本的语义信息。例如,“prompt”的嵌入可能是[0.2, -0.1, 0.3, …] + [-0.4, 0.5, -0.2, …] = [-0.2, 0.4, 0.1, …]。
-
最后,LLM使用这个嵌入向量作为输入,通过一系列的神经网络层来生成输出。输出可以是文本、图像或其他类型的数据,取决于LLM的目标。例如,如果LLM的目标是生成一个与“prompt”相关的句子,它可能会输出“Prompt engineering is a skill that involves crafting text-based prompts for AI systems.”。
使用向量搜索进行语义检索:
当我们想要从LLM中检索特定的知识时,我们可以利用向量搜索(vector search)技术。向量搜索是一种基于语义嵌入进行信息检索的方法,它可以在大型数据集中快速找到最相关的结果。以下是使用向量搜索进行语义检索的步骤:
-
首先,我们需要准备一个包含我们想要检索的知识的数据集。数据集可以是任何类型的文本数据,如文章、书籍、百科全书等。例如,如果我们想要从维基百科中检索关于太阳系行星的知识,我们可以使用维基百科文章作为数据集。
-
然后,我们需要对数据集中的每个文本元素(如标题、段落或句子)进行嵌入,并将它们存储在一个索引中。索引是一个包含所有嵌入向量及其对应文本元素的数据库。例如,如果我们对维基百科文章中的每个标题进行嵌入,并将它们存储在一个索引中,我们可能会得到类似于以下内容的结果:
嵌入向量 | 标题 |
---|---|
[0.1, -0.2, 0.3, …] | 太阳 |
[-0.4, 0.5, -0.1, …] | 地球 |
[0.2, -0.3, 0.4, …] | 火星 |
… | … |
-
接下来,我们需要提供一个查询(query),即我们想要检索的知识的描述。查询可以是一个单词、一个短语或一个问题。例如,如果我们想要知道太阳系中哪个行星最大,我们可以提供以下查询:“太阳系中最大的行星是什么?”
-
然后,我们需要对查询进行嵌入,并将其与索引中的嵌入向量进行比较。我们可以使用不同的度量来比较向量之间的相似性,如余弦相似度(cosine similarity)或欧几里得距离(Euclidean distance)。一般来说,相似度越高或距离越小,表示向量之间的语义关系越强。例如,如果我们对查询“太阳系中最大的行星是什么?”进行嵌入,并将其与索引中的嵌入向量进行比较,我们可能会得到类似于以下内容的结果:
嵌入向量 | 标题 | 相似度 |
---|---|---|
[0.1, -0.2, 0.3, …] | 太阳 | 0.4 |
[-0.4, 0.5, -0.1, …] | 地球 | 0.2 |
[0.2, -0.3, 0.4, …] | 火星 | 0.3 |
[0.3, -0.4, 0.5, …] | 木星 | 0.8 |
… | … | … |
-
最后,我们需要从索引中返回与查询最相似的文本元素,即最相关的结果。我们可以根据相似度或距离对结果进行排序,并选择前几个或一个作为答案。例如,如果我们根据相似度对结果进行排序,并选择最相似的一个作为答案,我们可能会得到以下答案:“太阳系中最大的行星是木星。”
微调LLM:方法和应用
微调LLM是一种用来改善预训练模型性能的技术,它可以使模型更好地适应特定的任务或领域。微调的过程涉及提供一些示例数据,以及调整模型的参数,如学习率、批次大小或优化器。通过微调,模型可以学习到与示例数据相关的特征和规律,从而生成更准确和上下文相关的响应。以下是微调LLM的步骤:
-
首先,我们需要选择一个预训练的LLM,如GPT-3/Gpt-3.5/GPT-4。预训练的LLM是一个已经在大量的通用文本数据上进行过训练的模型,它具有强大的语言理解和生成能力。我们可以根据我们的目标和需求来选择不同的LLM版本,如大小、速度或精度。
-
然后,我们需要准备一些示例数据,即一些与我们想要执行的任务相关的输入和输出对。示例数据可以是任何类型的文本数据,如对话、代码、问题等。例如,如果我们想要微调一个能够生成编程问题的LLM,我们可以准备一些类似于以下内容的示例数据:
输入 | 输出 |
---|---|
Write a function in Python that takes a list of numbers and returns the sum of the squares of the numbers. | def sum_of_squares(numbers):<br> total = 0<br> for n in numbers:<br> total += n**2<br> return total |
Write a function in Java that takes a string and reverses it. | public static String reverseString(String s) {<br> StringBuilder sb = new StringBuilder();<br> for (int i = s.length() - 1; i >= 0; i–) {<br> sb.append(s.charAt(i));<br> }<br> return sb.toString();<br>} |
-
接下来,我们需要将示例数据分成训练集、验证集和测试集。训练集是用来训练模型的数据,验证集是用来评估模型性能并调整参数的数据,测试集是用来在最后测试模型效果的数据。一般来说,我们可以按照80/10/10或70/15/15的比例来划分数据集。
-
然后,我们需要使用训练集来微调模型。微调的过程涉及将输入传递给模型,并与输出进行比较。如果输出与期望不符,模型会根据误差反向传播算法来调整其内部参数,以减少误差。这个过程会在训练集上重复多次,直到模型达到一个合理的性能水平。
-
接下来,我们需要使用验证集来评估模型性能,并根据需要调整参数。评估模型性能的方法可以根据不同的任务而不同,如准确率、召回率或F1分数等。根据评估结果,我们可以调整一些影响模型学习速度和稳定性的参数,如学习率、批次大小或优化器等。
-
最后,我们需要使用测试集来测试模型效果,并检查是否存在过拟合或欠拟合等问题。过拟合是指模型在训练集上表现很好,但在新数据上表现很差的情况。欠拟合是指模型在训练集和新数据上都表现不佳的情况。如果存在这些问题,我们可以采取一些措施来解决,如增加或减少数据量、增加或减少模型复杂度、添加或删除正则化等。
微调LLM的应用:
微调LLM可以用于各种类型的任务,如聊天机器人、代码生成、摘要生成等。以下是一些微调LLM的应用示例:
-
聊天机器人:我们可以微调一个LLM来创建一个能够与用户进行自然和有趣的对话的聊天机器人。我们可以提供一些与我们想要的聊天风格和主题相关的对话示例,如幽默、友好或专业等。例如,如果我们想要微调一个能够提供旅游建议的聊天机器人,我们可以提供一些类似于以下内容的对话示例:
输入 | 输出 |
---|---|
Hi, I’m looking for a place to visit in Europe. | Hi, welcome to TravelBot. I’m here to help you find your ideal destination in Europe. What kind of place are you interested in? |
I like historical and cultural sites. | I see. In that case, you might want to consider visiting Rome, Paris, or Athens. They are all rich in history and culture, and have many attractions to offer. |
-
代码生成:我们可以微调一个LLM来创建一个能够根据自然语言描述生成代码的工具。我们可以提供一些包含不同编程语言和任务的代码示例,如Python、Java或C++等。例如,如果我们想要微调一个能够根据自然语言描述生成Python代码的工具,我们可以提供一些类似于以下内容的代码示例:
输入 | 输出 |
---|---|
Write a function in Python that takes a list of numbers and returns the sum of the squares of the numbers. | def sum_of_squares(numbers):<br> total = 0<br> for n in numbers:<br> total += n**2<br> return total |
Write a function in Python that takes a string and reverses it. | def reverse_string(s):<br> return s[::-1] |
-
摘要生成:我们可以微调一个LLM来创建一个能够根据长文本生成简短摘要的工具。我们可以提供一些包含不同类型和领域的文本和摘要示例,如新闻、科学或文学等。例如,如果我们想要微调一个能够根据新闻文章生成摘要的工具,我们可以提供一些类似于以下内容的文本和摘要示例:
输入 | 输出 |
---|---|
Scientists in South Korea have managed to sustain a nuclear fusion reaction running at temperatures in excess of 100 million°C for 30 seconds for the first time. The experiment was conducted at the Korea Superconducting Tokamak Advanced Research (KSTAR) facility, which aims to replicate the fusion process that powers the Sun. Nuclear fusion is considered a potential source of clean and unlimited energy, but it is extremely difficult to achieve and maintain. The KSTAR team said their achievement was a major step towards the development of fusion reactors. | South Korean scientists achieve nuclear fusion milestone by running a reaction at over 100 million°C for 30 seconds. |
总结和结论:掌握LLM嵌入和微调
LLM嵌入和微调是两种用来适应特定任务的LLM技术,它们有不同的目的和优势。语义嵌入是文本的数值向量表示,能够捕捉语义信息。利用语义嵌入进行搜索可以快速有效地检索相关信息,特别是在大型数据集中。语义搜索通常在目标是访问模型中的特定知识时被首选。微调是一种用来改善预训练模型性能的技术,能够使模型更好地适应特定的任务或领域。通过提供示例数据并调整模型参数,微调可以使模型生成更准确和上下文相关的响应。微调通常在目标是生成特定类型或格式的输出时被首选。
通过掌握LLM嵌入和微调,我们可以充分利用LLM的强大能力,为各种应用创建高质量的解决方案。无论是聊天机器人、代码生成、摘要生成,还是其他类型的任务,我们都可以通过选择合适的技术来优化我们的模型和输出。LLM嵌入和微调是LLM工程师的重要技能,值得我们深入学习和实践。
往期精彩内容(直接点击阅读):
解读网信办发布的《生成式人工智能服务管理暂行办法》
AIGC在农业领域的创新应用
ChatGPT最强竞品Claude2来了:代码、GRE成绩超越GPT-4,免费可用
AI炒股回报超500%?ChatGPT能否成为韭菜们的最强股市“外挂”?
两天百万关注,北大法律大模型ChatLaw火了:直接告诉你张三怎么判
如何用AIGC技术讲好中医药文化故事
如何用AI帮助撰写应急预案
AIGC技术在文旅领域的应用
基辛格:ChatGPT预示着一场智能革命,而人类还没准备好
AIGC在心理咨询领域的应用
AI虚拟人如何助力中医药文化传播
AutoGPT太火了,无需人类插手自主完成任务,大步迈向自主人工智能时代
盘点全球提供法律机器人的公司
李彦宏:大模型即将改变世界(全文及完整PPT)
从本质看ChatGPT:当知识、人性、价值观皆可训练时,AI是什么?
欢迎关注“AI演进”并加入AI演进社群
相关文章:
提示词工程: 大语言模型的Embedding(嵌入和Fine-tuning(微调)
本文是针对这篇文章(https://www.promptengineering.org/master-prompt-engineering-llm-embedding-and-fine-tuning/)的中文翻译,用以详细介绍Embedding(语义嵌入)和Fine Tuning(微调)的概念和…...

rust获取本地外网ip地址的方法
大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info的使用。 get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址&a…...

三、Sharding-JDBC系列03:自定义分片算法
目录 一、概述 1.1、分片算法 精确分片算法 范围分片算法 复合分片算法 Hint分片算法 1.2、分片策略 标准分片策略 复合分片策略 行表达式分片策略 Hint分片策略 不分片策略 二、自定义分片算法 - 复合分片算法 (1)、创建数据库和表 (2)、自定义分库算法 (3)、…...

像操作本地文件一样操作linux文件 centos7环境下samba共享服务搭建详细教程
1.安装dnf yum -y install dnf 2.安装samba dnf install samba -y 3.配置 3.1创建并设置用户信息 #创建用户 useradd -M -s /sbin/nologin samba echo 123|passwd --stdin samba mkdir /home/samba chown -R samba:samba /home/samba smbpasswd -a samba smaba设置密码示…...
web块级如何居中,关于css/html居中问题
1. text-align:center; 可以实现其内部元素水平居中,通常用于字体水平居中,初学者也可以用于简单块级居中。这种方法对行内元素 (inline),行内块 (inline-block),行内表 (inline-table),inline…...
docker 部署 springboot 2.6.13 jar包流程笔记
1 . 将dockerfile复制到与jar包同一目录 Dockerfile # 基础镜像 FROM openjdk:8 # 环境变量 ENV APP_HOME/apps # 创建容器默认进入的目录 WORKDIR $APP_HOME # 复制jar包到容器中 COPY ./elastic-log-service.jar ./elastic-log-service.jar # 暴露端口 EXPOSE 8003 # 启动命…...

rust跟我学二:模块编写与使用
图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info中模块的使用。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址:[我的Rust库更新]g…...

数据结构——Java实现栈和队列
一、栈 Stack 1.特点 (1)栈是一种线性数据结构 (2)规定只能从栈顶添加元素,从栈顶取出元素 (3)是一种先进后出的数据结构(Last First Out)LIFO 2.具体实现 Java中可…...

【状态压缩】【动态规划】【C++算法】691贴纸拼词
作者推荐 【动态规划】【数学】【C算法】18赛车 本文涉及知识点 状态压缩 动态规划 LeetCode:691 贴纸拼词 我们有 n 种不同的贴纸。每个贴纸上都有一个小写的英文单词。 您想要拼写出给定的字符串 target ,方法是从收集的贴纸中切割单个字母并重新排列它们。如…...
JavaEE之多线程编程:3. 线程的状态(易懂!)
文章目录 一、关于线程的状态二、观察线程的所有状态1. NEW状态2. TERMINATED状态3. RUNNABLE状态4. TIMED_WAITING 一、关于线程的状态 进程最核心的状态,一个是就绪状态,一个是阻塞状态(对于线程同样使用)。 以线程为单位进行调…...
Android13预装APP到data分区
修改步骤与Android11是差不多的,只是有部分代码所在位置不一样。 Android 11内置APP到data/app Android 8(O)预置APP到data/app 默认内置应用到data会出错 1970-01-01 08:03:54.499 1177-1177/system_process I/PackageManager: /data/app/xx changed; collecting…...

Docker registry镜像仓库,私有仓库及harbor管理详解
目录 registry镜像仓库概述 Docker 镜像仓库(Docker Registry): registry 容器: 私有仓库概述 搭建本地私有仓库示例 Harbor概述 harbor架构 详解构成 Harbor由容器构成 Harbor部署示例 环境准备 部署Docker-Compose服…...

用 Rust 过程宏魔法简化 SQL 函数实现
#[function("length(varchar) -> int4")] pub fn char_length(s: &str) -> i32 {s.chars().count() as i32 }这是 RisingWave 中一个 SQL 函数的实现。只需短短几行代码,通过在 Rust 函数上加一行过程宏,我们就把它包装成了一个 SQL…...

OpenSource - 基于 DFA 算法实现的高性能 java 敏感词过滤工具框架
文章目录 sensitive-word创作目的特性变更日志更多资料敏感词控台敏感词标签文件 快速开始准备Maven 引入核心方法判断是否包含敏感词返回第一个敏感词返回所有敏感词默认的替换策略指定替换的内容自定义替换策略 IWordResultHandler 结果处理类使用实例 更多特性样式处理忽略大…...

端杂七杂八系列篇四-Java8篇
后端杂七杂八系列篇四-Java8篇 ① Lombok插件① RequiredArgsConstructor② SneakyThrows③ UtilityClass④ Cleanup ② Lambda 4个常用的内置函数① Function<T, R> - 接受一个输入参数并返回一个结果② Consumer - 接受一个输入参数,并执行某种操作…...
操作系统一些面试
你这个请求队列是属于一写多读对吧,怎么解决冲突的? 可以采用双buffer或者说双缓冲区,一个缓冲区用来写,一个缓冲区用来读,采用交换指针的方法来进行缓存区的交换,这样交换效率是O(1)的,但是交…...

大语言模型
概念 大语言模型(Large Language Model,简称LLM)是一种基于人工智能技术的自然语言处理模型,是指在大量数据上训练的高级人工智能算法,以自上文推理词语概率为核心任务。它通过在海量文本数据上进行训练,学…...

php反序列化之pop链构造(基于重庆橙子科技靶场)
常见魔术方法的触发 __construct() //创建类对象时调用 __destruct() //对象被销毁时触发 __call() //在对象中调用不可访问的方法时触发 __callStatic() //在静态方式中调用不可访问的方法时触发 __get() //调用类中不存在变量时触发(找有连续箭头的…...

k8s---对外服务 ingress
目录 目录 目录 ingress与service ingress的组成 ingress-controller: ingress暴露服务的方式 2.方式二:DaemonSethostnetworknodeSelector DaemonSethostnetworknodeSelector如何实现 3.deploymentNodePort: 虚拟主机的方式实现http代…...

最优解-最长公共子序列
问题描述 最长公共子序列(Longest Common Subsequence,LCS)即求两个序列最长的公共子序列(可以不连续)。比如3 2 1 4 5和1 2 3 4 5两个序列,最长公共子序列为2 4 5 长度为3。解决这个问题必然要使用动态规划。既然要用到动态规划,就要知道状…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 允许出现允许…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...