OpenAI的文本嵌入衡量文本字符串的相关性。嵌入通常用于:

  • 搜索(其中结果按与查询字符串的相关性排名)
  • 聚类(其中文本字符串按相似性分组)
  • 推荐(推荐具有相关文本字符串的项目)
  • 异常检测(识别出相关性不大的异常值)
  • 多样性测量(分析相似性分布)
  • 分类(其中文本字符串按其最相似的标签分类)

嵌入是浮点数的向量(列表)。两个向量之间的距离衡量它们的相关性。小距离表示高相关性,大距离表示低相关性。 但是OpenAI的文本嵌入接口对中文的支持并不好,社区经过实践,对中文支持比较好的模型是Hugging face上的 ganymedenil/text2vec-large-chinese。具体可以参见:https://huggingface.co/GanymedeNil/text2vec-large-chinese/discussions/3 ,作者采用的训练数据集是 中文STS-B数据集。它将句子映射到 768 维密集向量空间,可用于任务 如句子嵌入、文本匹配或语义搜索。

在Semantic Kernel 的Sample 下有一个 hugging-face-http-server:https://github.com/microsoft/semantic-kernel/tree/main/samples/apps/hugging-face-http-server ,通过这个示例项目,我们可以在本地运行Huggingface模型。

我们首先构建一个Docker,执行命令 docker image build -t hf_model_server . ,最新的构建会有问题,我把它独立成一个repo :https://github.com/mlnethub/hugging-face-http-server

运行容器

docker run -p 5000:5000 -d hf_model_server

访问http://localhost:5000

通过从0.14版本引入的 Nuget 包 Microsoft.SemanticKernel.Connectors.AI.HuggingFace:https://www.nuget.org/packages/Microsoft.SemanticKernel.Connectors.AI.HuggingFace/0.14.547.1-preview#versions-body-tab

具体用法参考单元测试代码HuggingFaceEmbeddingGenerationTests

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Net.Http;

using System.Threading.Tasks;

using Microsoft.SemanticKernel.Connectors.AI.HuggingFace.TextEmbedding;

using Xunit;

namespace SemanticKernel.Connectors.UnitTests.HuggingFace.TextEmbedding;

/// <summary>

/// Unit tests for <see cref="HuggingFaceTextEmbeddingGeneration"/> class.

/// </summary>

public class HuggingFaceEmbeddingGenerationTests : IDisposable

{
     private const string Endpoint = "http://localhost:5000/embeddings";
     private const string Model = @"GanymedeNil/text2vec-large-chinese";

private readonly HttpResponseMessage _response = new()
     {
         StatusCode = HttpStatusCode.OK,
     };

/// <summary>
     /// Verifies that <see cref="HuggingFaceTextEmbeddingGeneration.GenerateEmbeddingsAsync"/>
     /// returns expected list of generated embeddings without errors.
     /// </summary>
     [Fact]
     public async Task ItReturnsEmbeddingsCorrectlyAsync()
     {
         // Arrange
         const int ExpectedEmbeddingCount = 1;
         const int ExpectedVectorCount = 8;
         List<string> data = new() { "test_string_1", "test_string_2", "test_string_3" };

using var service = this.CreateService(HuggingFaceTestHelper.GetTestResponse("embeddings_test_response.json"));

// Act
         var embeddings = await service.GenerateEmbeddingsAsync(data);

// Assert
         Assert.NotNull(embeddings);
         Assert.Equal(ExpectedEmbeddingCount, embeddings.Count);
         Assert.Equal(ExpectedVectorCount, embeddings.First().Count);
     }

/// <summary>
     /// Initializes <see cref="HuggingFaceTextEmbeddingGeneration"/> with mocked <see cref="HttpClientHandler"/>.
     /// </summary>
     /// <param name="testResponse">Test response for <see cref="HttpClientHandler"/> to return.</param>
     private HuggingFaceTextEmbeddingGeneration CreateService(string testResponse)
     {
         this._response.Content = new StringContent(testResponse);

var httpClientHandler = HuggingFaceTestHelper.GetHttpClientHandlerMock(this._response);

return new HuggingFaceTextEmbeddingGeneration(new Uri(Endpoint), Model, httpClientHandler);
     }

public void Dispose()
     {
         this.Dispose(true);
         GC.SuppressFinalize(this);
     }

protected virtual void Dispose(bool disposing)
     {
         if (disposing)
         {
             this._response.Dispose();
         }
     }

}

中文环境下使用 huggingface 模型替换 OpenAI的Embedding 接口的更多相关文章

  1. 安装debian 9.1后,中文环境下将home目录下文件夹改为对应的英文

    安装了debian 9.1后,中文环境下home目录下文件夹显示的是中文,相当不方便cd命令,改为对应的英文吧,需要用到的软件xdg-user-dirs-gtk #安装需要的软件 sudo apt i ...

  2. 解决Linux中文环境下astro和Calibre不能输入的问题

    例如我的opensuse在中文环境下不能在astro中输入指令,Calibre的grid spacing设置框不能输入,经过摸索,找到以下两种解决方法: 1.    将系统环境变成英文,在.bashr ...

  3. 中文环境下PostgreSQL的使用

    虽然官方文档有提到编码的问题,但是对于中文讲的比较简单,给中文的PostgreSQL用户带来很多困扰,本文简单简述一下中文环境下PostgreSQL如何正确设置编码. 一.服务器端的编码设置 Post ...

  4. windows和linux环境下keras的模型框架可视化

    1.简介 keras提供了模型可视化模块,下面讲解下安装教程和简易教程. 2.安装教程 2.1windows环境下的安装 2.1.1安装指定模块 pip install pydot-ng pip in ...

  5. Linux 环境下 网络IO模型

    本文讨论的背景是Linux环境下的network IO. IO发生时涉及的对象和步骤: 对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的proce ...

  6. 解决中文环境下zabbix监控图形注释乱码

    zabbix监控的图形界面能够更直观的查看监控状态,当我们把zabbix的语言切换为中文的时候,会发现监控图形中一些中文参数会乱码,例如下面的效果 但是图形界面在原生的英文环境下完全没有乱码问题.为了 ...

  7. Win 10环境下6sV2.1模型编译心得

    最新版本6sV2.1模型是通过FORTRAN95编写的,2017年11月代码编写完成,2018年11月发布在模型官网上.通常我们在使用过程中都是调用模型的.exe可执行文件,而下载下来的是FORTRA ...

  8. WP8_(windows phone环境下)上传文件从C#到php接口

    在windows phone环境下,将手机上的图片上传到服务端(php环境): 注意事项:在上传的地方,头文件中name,例如name= img,则在php服务端处理时 ,需要约定好 存取一致 php ...

  9. Oracle在中文环境下出现乱码解决办法

       zysong.ttf下载是一款oracle字体乱码解决工具,实质于缺乏中文字体包! 01情况的例子 02情况的例子 01.在开始安装的时候出现乱码 下载zysong.ttf,unzip 解压 一 ...

  10. Object_C 集成环信时,中文环境下不显示中文

    因为本app只有中文,没有做中英文判断,但是环信是默认英文环境的,所以,此时,需要在info.plist 文件中修改它的语言环境.如下

随机推荐

  1. GO语言学习笔记-测试篇 Study for Go ! Chapter ten- Test

    持续更新 Go 语言学习进度中 ...... GO语言学习笔记-类型篇 Study for Go! Chapter one - Type - slowlydance2me - 博客园 (cnblogs ...

  2. smart rtmpd web 接口说明

    ​ smart rtmpd web 接口分为下面几类 分类名称 功能描述 live 这个就是平常我们的直播播放接口 rec   这个就是平常我们的录像回放接口 vod   这个就是我们点播接口,支持字 ...

  3. 深入理解 Python 虚拟机:字典(dict)的实现原理及源码剖析

    深入理解 Python 虚拟机:字典(dict)的实现原理及源码剖析 在本篇文章当中主要给大家深入介绍一下在 cpython 当中字典的实现原理,在本篇文章当中主要介绍在早期 python3 当中的版 ...

  4. 淘宝商品信息定向爬虫.py(亲测有效)

    import requests import re def getHTMLText(url): try: kv = { 'cookie': '', #要换成自己网页的cookie 'user-agen ...

  5. 传输层和网络层的checksum区别,TCP cksum为何包含伪首部

    一直搞不清传输层和网络层的校验和为什么校验内容不一样,最近问了一些前辈,找寻了一些答案,总结一下自己的思考. 先说一下传输层(TCP)和网络层(IP)的校验和: TCP校验和有伪首部.TCP herd ...

  6. Redis的自增也能实现滑动窗口限流?

    限流是大家开发之路上一定会遇到的需求.比如:限制一定时间内,接口请求请求频率:一定时间内用户发言.评论次数等等,类似于滑动窗口算法.这里分享一份拿来即用的代码,一起看看如何利用常见的 Redis 实现 ...

  7. [软件设计&系统建模] Web软件通用能力模块

    0 基础工具 1 日志 2 权限 3 文件处理(下载/上传) 4 对象池 对象池 数据库连接池 线程池 5 微服务 服务网关 配置中心 注册中心 服务调用 服务熔断 健康检测 Actuator 6 缓 ...

  8. [Linux]VMware启动CENOTS7时报"welcome to emergency mode!"【转载】

    1 问题描述 由于通过VMwaer快速克隆了一台CENTOS7.9的虚拟机. 但启动时报如下错误信息 welcome to emergency mode!after logging in ,type ...

  9. JQuery点击复制文本框内容的方法插件

    [导读] 文章介绍了两种常用的点击复制文本框内容方法,一种是but IE only,同样的这个也是我们经常使用的.优点是体积小,仅有十来行代码,但缺点也很明显,只支持IE及以IE为内核的浏览器,另一种 ...

  10. python函数参数与类参数

    python关于函数的一些应用 前言 鉴于python3与python2有些不同,看到某些代码时可能会感到疑惑,就稍微记录一下. 一.不限制个数的函数参数 1.*args 以此为参数,会被python ...