(6)SK Memory 理论篇
Memory 是提供更广泛背景的有力方式。从历史上看,我们一直将Memory视为计算机工作的核心组成部分:想想你笔记本电脑中的 RAM 。仅具备可以进行数字运算的 CPU 而没有内存,计算机就不太有用,除非它知道你关心的那些数字。Memory是使计算与手头任务相关的关键。
我们通过三种方式之一访问Memory,而第三种方式最有趣:
- 传统的键-值对:
- 就像你在shell中设置环境变量一样,使用Semantic Kernel时也可以进行相同的操作。查找是“传统的”,因为它是一个键和查询之间的一对一匹配。
- 传统的本地存储:
- 当您将信息保存到文件中时,可以通过文件名检索它。当您有大量信息要存储在键-值对中时,最好将其保存在磁盘上。
- Kernel Memory搜索:
- 你也可以将文本信息表示为一长串数字,称为
Embedding
。这使您可以执行“语义”搜索,将您的查询与意义进行比较。
- 你也可以将文本信息表示为一长串数字,称为
Kernel Memory是如何工作的?
嵌入是一种将单词或其他数据表示为高维空间中的向量的方式。
向量就像具有方向和长度的箭头。
高维空间意味着空间具有许多维度,比我们能看到或想象的要多。
这个想法是相似的单词或数据将具有相似的向量,而不同的单词或数据将具有不同的向量。
这有助于我们衡量它们的关联程度或无关程度,并且执行一些操作,比如加法、减法、乘法等。
嵌入对AI模型很有用,因为它们可以以计算机可以理解和处理的方式捕捉单词或数据的含义和上下文。
所以基本上你会拿一个句子、段落或整页文字,然后生成相应的嵌入向量。
当进行查询时,查询会被转换为其嵌入表示,然后通过所有现有的嵌入向量进行搜索,以找到最相似的内容。
这类似于你在Bing上进行搜索查询时,它会给你多个与你查询相关的结果。
Kernel Memory不太可能给你一个完全匹配的结果,但它总是会给你一组匹配项,以与其他文本多相似程度排名。
为什么在LLM AI中Embedding是重要的?
由于提示是我们输入到AI模型中以生成所需输出或响应的文本,我们需要考虑输入文本的长度,基于我们选择使用的模型的令牌限制。
例如,GPT-4可以处理每个输入高达8,192个令牌,而GPT-3只能处理多达4,096个令牌。这意味着长于模型令牌限制的文本将无法适应,可能会被截断或忽略。
如果我们能够使用整整一本10,000页的操作手册作为我们提示的文本,那将会很好,但由于令牌限制的约束,这是不可能的。因此,嵌入对于将这个大文本分解为较小的部分是非常有用的。
我们可以通过将每一页进行总结成一个较短的段落,然后为每个摘要生成一个嵌入向量来实现这一点。 嵌入向量就像是文本的压缩表示,能保留其含义和上下文。然后我们可以比较摘要的嵌入向量和提示的嵌入向量,选择最相似的摘要。然后,我们可以将这些摘要添加到我们的输入文本中,作为提示的上下文。
通过这种方式,我们可以利用Embedding来帮助我们选择和适应作为模型标记限制内的大文本作为上下文。
什么是Embeddings?
:::info{title=Embeddings}
内存:Embeddings
- Embeddings是表示模型处理的标记的含义和上下文的数字向量或数组。
- 它们用于对输入和输出文本进行编码和解码,大小和维度可以不同。/ Embeddings可以帮助模型理解标记之间的关系,并生成相关和连贯的文本。
- 它们用于文本分类、摘要、翻译和生成,以及图像和代码生成。
👆 由插件生成的注释 SummarizePlugin.Notegen
:::
Embeddings
是对标记的表征或编码,例如句子、段落或文档,Embeddings到高维向量空间中,其中每个维度对应于语言的一个学习特征或属性。Embeddings是模型捕捉和存储语言的含义和关系的方式,也是模型比较和对比不同标记或语言单元的方式。Embeddings是模型中离散和连续、符号和数值方面的语言之间的桥梁。
Embeddings(Embeddings)对于程序员来说是什么?
Embeddings
是表示模型处理和生成的令牌的含义和上下文的向量或数组。Embeddings是从模型的参数或权重导出的,并用于对输入和输出文本进行编码和解码。Embeddings可以帮助模型理解令牌之间的语义和句法关系,并生成更相关和连贯的文本。Embeddings还可以使模型处理多模态任务,例如图像和代码生成,通过将不同类型的数据转换为共同的表示。Embeddings是基于 GPT 的模型使用的变压器架构的重要组件,可以根据模型和任务的不同而具有不同的大小和维度。
Embeddings是如何使用的?
Embeddings
用于:
- 文本分类:
- Embeddings可以帮助模型根据文本的含义和上下文为其分配标签或类别。例如,Embeddings可以帮助模型将文本分类为积极或消极、垃圾邮件或非垃圾邮件、新闻或观点等。
- 文本摘要:
- Embeddings可以帮助模型从文本中提取或生成最重要或相关的信息,并创建简洁连贯的摘要。例如,Embeddings可以帮助模型总结新闻文章、产品评论、研究论文等。
- 文本翻译:
- Embeddings可以帮助模型将文本从一种语言翻译成另一种语言,同时保持原文本的意义和结构。例如,Embeddings可以帮助模型在英语和西班牙语、法语和德语、中文和日语等之间进行文本翻译。
- 文本生成:
- Embeddings可以帮助模型根据用户提供的输入或提示创建新的原创文本。例如,Embeddings可帮助模型生成故事、诗歌、笑话、口号、标题等文本。
- 图像生成:
- Embeddings可以帮助模型将文本转换成图像,或者反之亦然,通过将不同类型的数据转换为共同的表示形式。例如,Embeddings可以帮助模型生成标志、人脸、动物、风景等图像。
- 代码生成:
- Embeddings可以帮助模型根据文本创建代码,或者相反地,通过将不同类型的数据转换为共同的表示形式。例如,Embeddings可以帮助模型生成HTML、CSS、JavaScript、Python等代码。
什么是vector-db?
vector-db
是一种数据库类型,它将数据存储为高维向量,这些向量是特征或属性的数学表示。每个向量都具有一定数量的维度,取决于数据的复杂性和细粒度,维度可以在几十到数千之间。这些向量通常是通过对原始数据应用某种转换或嵌入函数生成的,比如文本、图像、音频、视频等。嵌入函数可以基于各种方法,如机器学习模型、词嵌入、特征提取算法。 vector-db
的主要优势在于它能够快速准确地进行相似度搜索,并根据矢量距离或相似度检索数据。这意味着,你可以使用vector-db
来查找语义或上下文含义最相似或相关的数据,而不是使用基于精确匹配或预定义条件的传统查询数据库方法。
例如,你可以使用vector-db
来:
- 根据视觉内容和风格查找与给定图像相似的图像
- 基于主题和情感寻找与给定文档相似的文档
- 基于产品特性和评级寻找与给定产品相似的产品 在向量数据库中进行相似性搜索和检索,您需要使用一个代表您所需信息或标准的查询向量。查询向量可以是从与存储向量相同类型的数据中派生而来(例如,使用图像作为图像数据库的查询),也可以来自不同类型的数据(例如,使用文本作为图像数据库的查询)。然后,您需要使用一个相似性度量来计算向量空间中两个向量的接近程度或距离。相似性度量可以基于各种度量标准,例如余弦相似度、欧几里德距离、汉明距离、杰卡德指数。 相似性搜索和检索的结果通常是一组排名最高的向量,这些向量与查询向量具有最高的相似度分数。然后,您可以从原始源或索引中访问与每个向量相关联的相应原始数据。
vector-db
的用例
vector-db
在涉及自然语言处理(NLP)、计算机视觉(CV)、推荐系统(RS)以及其他需要语义理解和数据匹配的领域和应用中有许多用例。
在vector-db
中存储信息的一个用例是为了使大型语言模型(LLMs)能够基于AI 插件生成更相关和连贯的文本。 然而,大型语言模型经常面临一些挑战,比如生成不准确或无关的信息;缺乏事实的一致性或常识;重复或自相矛盾;存在偏见或冒犯性。为了克服这些挑战,您可以使用一个向量数据库来存储有关不同主题、关键词、事实、观点和/或与所需领域或流派相关的来源的信息。然后,您可以使用大型语言模型,并通过 AI 插件从向量数据库中传递信息,以生成更具信息量和吸引力的内容,以满足您的意图和风格。 例如,如果你想写一篇关于人工智能最新趋势的博客文章,你可以使用向量数据库存储关于该主题的最新信息,并将该信息与请求一起传递给LLM,以便生成利用最新信息的博客文章。
Azure中的向量数据库
以下Azure服务可以帮助你满足向量数据库的需求:
可用的向量数据库连接器
semantic-kernel提供了几个连接器,您可以使用这些连接器来存储和检索信息。这些包括:
服务 | C# | Python |
---|---|---|
Azure Cosmos DB 中的 MongoDB vCore 向量数据库 | Python | |
Azure AI 搜索 | C# | Python |
Azure PostgreSQL服务器 | C# | |
Azure SQL数据库 | C# | |
Chroma | C# | Python |
DuckDB | C# | |
Milvus | C# | Python |
MongoDB Atlas Vector Search | C# | Python |
Pinecone | C# | Python |
Postgres | C# | Python |
Qdrant | C# | |
Redis | C# | |
Sqlite | C# | |
Weaviate | C# | Python |