当前位置:首页 > AI > 正文内容

Semantic Kernel 学习笔记:开始体会用 Semantic Memory 生成 Embedding 并进行语义查找

邻居的猫1个月前 (12-09)AI1426

Semantic Kernel 的 Memory 有两种完结,一个是 Semantic Kernel 内置的 Semantic Memory,一个是独立的 Kernel Memory,Kernel Memory 是从 Semantic Kernel 进化而来。

关于 Semantic Memory 的介绍(来历):

Semantic Memory (SM) is a library for C#, Python, and Java that wraps direct calls to databases and supports vector search. It was developed as part of the Semantic Kernel (SK) project and serves as the first public iteration of long-term memory. The core library is maintained in three languages, while the list of supported storage engines (known as "connectors") varies across languages.

学习方针:经过 Semantic Memory 调用 OpenAI 的 api,运用 text-embedding-ada-002 模型生成文本的 embedding,保存在 in-memory 向量数据库中,然后进行语义查找。

学习材料:Semantic Kernel 源码库房中的示例程序 Example14_SemanticMemory.cs

创立 .NET 控制台项目

dotnet new console
dotnet add package Microsoft.SemanticKernel
dotnet add package --prerelease Microsoft.SemanticKernel.Plugins.Memory

创立 ISemanticTextMemory 实例

运用 MemoryBuilder 根据 OpenAITextEmbeddingGenerationService 创立 ISemanticTextMemory 的实例 SemanticTextMemory

#pragma warning disable SKEXP0011 
#pragma warning disable SKEXP0003 
#pragma warning disable SKEXP0052 
ISemanticTextMemory memory = new MemoryBuilder()
    .WithOpenAITextEmbeddingGeneration("text-embedding-ada-002", apiKey)
    .WithMemoryStore(new VolatileMemoryStore())
    .Build();
#pragma warning restore SKEXP0052 
#pragma warning restore SKEXP0003 
#pragma warning restore SKEXP0011 

注:上面代码中的 warning disable 是因为 MemoryBuilder 以及2个扩展办法都是 experimental feature

预备用户生成 Embedding 的文本数据

var sampleData = new Dictionary<string, string>
{
    ["https://github.com/microsoft/semantic-kernel/blob/main/README.md"]
        = "README: Installation, getting started, and how to contribute",
    ["https://github.com/microsoft/semantic-kernel/blob/main/dotnet/notebooks/02-running-prompts-from-file.ipynb"]
        = "Jupyter notebook describing how to pass prompts from a file to a semantic plugin or function"
};

生成 Embedding 并保存至 in-memory 向量数据库

var i = 0;
foreach (var entry in sampleData)
{
    await memory.SaveReferenceAsync(
        collection: "SKGitHub",
        externalSourceName: "GitHub",
        externalId: entry.Key,
        description: entry.Value,
        text: entry.Value);

    Console.Write($" #{++i} saved.");
}

SaveReferenceAsync 办法中调用了 IEmbeddingGenerationServiceGenerateEmbeddingAsync 办法生成 embedding,详见 SK 源码 SemanticTextMemory.cs#L60

var embedding = await this._embeddingGenerator.GenerateEmbeddingAsync(text, kernel, cancellationToken).ConfigureAwait(false);

注:embedding 值的类型是 ReadOnlyMemory<float>

咱们这儿用的是 OpenAI,所以调用的是 OpenAITextEmbeddingGenerationServiceGenerateEmbeddingsAsync 办法生成 embedding(详见SK源码),终究调用的是 Azure.AI.OpenAI.OpenAIClientGetEmbeddingsAsync 办法,详见 Azure SDK for .NET 的源码 OpenAIClient.cs#L552

根据 Embedding 数据进行语义查找

var query = "How do I get started?";
var memoryResults = memory.SearchAsync("SKGitHub", query, limit: 1, minRelevanceScore: 0.5);

SearchAsync 办法中也调用了 GenerateEmbeddingsAsync 办法根据查询文本生成 embedding,详见 SemanticTextMemory.cs#L108

输出语义查找的成果

await foreach (var memoryResult in memoryResults)
{
    Console.Write($"Result:");
    Console.Write("  URL:     : " + memoryResult.Metadata.Id);
    Console.Write("  Title    : " + memoryResult.Metadata.Description);
    Console.Write("  Relevance: " + memoryResult.Relevance);
}

运转控制台程序

输出成果:

  #1 saved.
  #2 saved.
Result:
  URL:     : https://github.com/microsoft/semantic-kernel/blob/main/README.md
  Title    : README: Installation, getting started, and how to contribute
  Relevance: 0.8224089741706848

查找成功,学习完结,完好示例代码见 https://www.cnblogs.com/dudu/articles/18037216

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=402

分享给朋友:

“Semantic Kernel 学习笔记:开始体会用 Semantic Memory 生成 Embedding 并进行语义查找” 的相关文章

【CameraPoseRefinement】以BARF为例介绍三维重建中的位姿优化

【CameraPoseRefinement】以BARF为例介绍三维重建中的位姿优化

Introduction 在计算机视觉三维重建中,求解3D场景的表明和定位给定的相机帧的相机位姿是两个非常重要的使命,这两个问题互为依靠,一方面,康复3D场景的表明需求运用已知的相机位姿进行调查;另一方面,定位相机需求来自特征点的牢靠对应。 过错的相机位姿会对重建的输出和功能发生一系列负面影响,包含...

吴恩达机器学习实战,从入门到精通

吴恩达机器学习实战,从入门到精通

1. 吴恩达机器学习课程资源: 知乎专栏:介绍了吴恩达教授的机器学习课程资源,包括详细的笔记文档、中英双语字幕视频、课后作业解决方案以及对应的代码示例。这些资源已经制作成百度云镜像,确保高速稳定下载。 GitHub项目:一个开源项目,包含吴恩达机器学习课程的个人笔记和用Python复现的...

机器学习联想,联想集团在机器学习领域的布局与发展

机器学习联想,联想集团在机器学习领域的布局与发展

1. 数据:机器学习依赖于大量的数据来进行训练和测试。这些数据可以是结构化的(如表格数据)或非结构化的(如图像、文本等)。2. 算法:机器学习算法是计算机系统用来从数据中学习的方法。常见的算法包括线性回归、决策树、支持向量机、神经网络等。3. 模型:机器学习模型是算法在训练数据上学习到的参数和结构。...

机器学习的发展,机器学习的发展概述

机器学习的发展,机器学习的发展概述

1. 深度学习的兴起:深度学习是机器学习的一个子领域,它使用多层神经网络来处理和学习数据。近年来,深度学习在图像识别、语音识别、自然语言处理等领域取得了突破性进展。2. 强化学习的应用:强化学习是一种让计算机通过与环境交互来学习最优行为的机器学习方法。它在游戏、机器人控制和自动驾驶汽车等领域有广泛应...

博弈机器学习,探索对抗与协作的智能边界

博弈机器学习,探索对抗与协作的智能边界

博弈机器学习(Game Theory in Machine Learning)是机器学习领域的一个新兴分支,它将博弈论的理论和方法应用到机器学习算法的设计和分析中。博弈论是研究多个智能体在相互作用中如何做出决策以最大化自身利益的数学理论。在机器学习中,博弈论可以帮助我们理解不同智能体(如学习算法、决...

机器学习基础英语,Introduction to Machine Learning: A Beginner's Guide

机器学习基础英语,Introduction to Machine Learning: A Beginner's Guide

1. 数据(Data):机器学习依赖于大量数据来训练模型。数据可以是结构化的(如表格数据)或非结构化的(如图像、文本)。2. 特征(Features):特征是从数据中提取的属性,用于描述数据样本。特征选择是机器学习中的一个重要步骤,它涉及选择对模型性能最相关的特征。4. 无监督学习(Unsuperv...