前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >中文环境下使用 huggingface 模型替换 OpenAI的Embedding 接口

中文环境下使用 huggingface 模型替换 OpenAI的Embedding 接口

作者头像
张善友
发布于 2023-05-23 09:23:18
发布于 2023-05-23 09:23:18
6.2K0
举报
文章被收录于专栏:张善友的专栏张善友的专栏

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();          }      } }

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Carson带你学Android:全面解析列表ListView与AdapterView
2. 在MainActivity上定义一个链表,将所要展示的数据以存放在里面 3. 构造ArrayAdapter对象,设置适配器 4. 将LsitView绑定到ArrayAdapter上 如下图:
Carson.Ho
2022/03/24
1.1K0
Carson带你学Android:全面解析列表ListView与AdapterView
Android开发:ListView、AdapterView、RecyclerView全面解析
AdapterView本身是一个抽象类,AdapterView及其子类的继承关系如下图:
Carson.Ho
2019/02/22
3.6K0
13.Android-ListView使用、BaseAdapter/ArrayAdapter/SimpleAdapter适配器使用
ListView 是 Android 系统为我们提供的一种列表显示的一种控件,使用它可以用来显示我们常见的列表形式。继承自抽象类 AdapterView。继承图如下所示:
诺谦
2020/02/18
2.1K0
13.Android-ListView使用、BaseAdapter/ArrayAdapter/SimpleAdapter适配器使用
Android开发之自定义的ListView(UITableViewController)
Android开发中的ListView, 顾名方法思义,就是表视图。表示图在iOS开发中就是TableView。两者虽然名称不一样,但是其使用方法,使用场景以及该控件的功能都极为相似,都是用来展示大量数据并带有分页的控件。本篇博客将要类比着iOS开发来认识一下ListView, 如果你是Android开发者,你可以看一下iOS中TableView的工作方式。如果你是初学者,那么只看Android的开发即可。其实Android开发和iOS开发有许多东西都是相通的,尽管控件的名称以及具体的使用方式不同,但是其使
lizelu
2018/01/11
1.4K0
Android开发之自定义的ListView(UITableViewController)
Android开发之Loader与LoaderManager
Loader是什么,有什么作用? 顾名思义就是加载器,简单来说,Loader做了2件事: (1)在单独的线程中读取数据,不会阻塞UI线程 (2)监视数据的更新 LoaderManager是什么,有什么作用? LoaderManager就是加载器的管理器,一个LoaderManager可以管理一个或多个Loader,一个Activity或者Fragment只能有一个LoadManager。LoaderManager管理Loader的初始化,重启和销毁操作。 使用Loader来加载手机中的音乐为例 1、主布
YungFan
2018/04/24
6990
Android开发之Loader与LoaderManager
Adapter与ListView的简单应用(下)Android应用界面开发
1.继续分析Adapter的常用类 上一篇文章使用了ArrayAdapte制作了一个只由简单的文字组成的ListView,那ArrayAdapter是不是只有简单显示一行文字的功能呢?答案是否定的。
爱因斯坦福
2018/09/10
6540
Android学习Tabhost、gallery、listview、imageswitcher
Tabhost控件又称分页控件,在很多的开发语言中都存在。它可以拥有多个标签页,每个标签页可以拥有不同的内容。android中,一个标签页可以放 一个view或者一个activity。TabHost是标签控件类的核心类,也是标签的集合。 1.tabhost定义 android控件中有封装好的tab控件,直接拖一个到xml文件中。下面的代码都是tab控件自己生成的。 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and
水击三千
2018/02/27
1.3K0
Android学习Tabhost、gallery、listview、imageswitcher
Android中使用ViewStub提高布局性能
在Android开发中,View是我们必须要接触的用来展示的技术.通常情况下随着View视图的越来越复杂,整体布局的性能也会随之下降.这里介绍一个在某些场景下提升布局性能的View,它就是ViewStub.
技术小黑屋
2018/09/05
7130
Android中使用ViewStub提高布局性能
android ListView 嵌套 ListView
看上去效果还是不错,不过现在有个刷新问题一直没能解决,刷新的时候里面的adapter进行刷新的时候总是会让里面的listview消失掉,应该是父listview先刷新完后,子listview还未刷新完成,导致测量的高度不对,就会消失,像当前组已关闭这种,现在这个问题还没有想到办法解决的,试过比较多的方法,添加接口让子listview 刷新完成后再去更新父listview,但还是没有作用,也用过ExpandableListView,但是效果达不到这种,所以没办法还是得用这种办法,有大神知道怎么解决刷新父listview时子listview消失的方法,指导下我,比较奇怪的时候刚开始初始化的时候子listview是默认不显示的,当点击父listview去张开子listview,父listview应该会再次刷新,但子listview展开是可以的,然后下一次更新数据源的时候子listview又会自动关闭,我猜应该是在刷新子listview的时候,父listview先更新完成,子listview的高度测量就没有对!
全栈程序员站长
2022/09/13
1.4K0
android ListView 嵌套 ListView
Head First Android SwipeRefreshLayout
本文内容和代码参考自Implementing Swipe to Refresh, an Android Material Design UI Pattern,原博客内容中略有错误。
宅男潇涧
2018/08/01
5550
Head First Android SwipeRefreshLayout
Android自定义样式listview
这个貌似很常用,以前会了现在正好用到了,所以就复习一下咯。 附上慕课网的视频地址,这个讲得hin详细http://www.imooc.com/learn/365 好了,步入正题,这里讲的就是要实现li
用户1148523
2018/01/09
2.1K0
新浪微博模仿的是_微博随便看看在哪
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/17
4750
新浪微博模仿的是_微博随便看看在哪
ListView使用技巧-更新中
虽然在Android5.X中,RecyclerView在很多地方组件取代了ListView,但是ListView的使用依然是分广泛。
小小工匠
2021/08/16
1K0
Android官方下拉选择控件Spinner
Demo: https://github.com/bige-ye/SpinnerDemo
yechaoa
2022/06/10
1.2K0
Android官方下拉选择控件Spinner
Android开发之SwipeRefreshLayout实现下拉刷新
简介 SwipeRefreshLayout是Google官方推出的一款下拉刷新组件,位于v4兼容包下,android.support.v4.widget.SwipeRefreshLayout,Support Library 必须19.1以上。使用起来很简单,只要在需要刷新的控件最外层加上SwipeRefreshLayout,其child必须是可滚动的view,如ScrollView、GridView或者ListView,这里就测试最常用的ListView。 布局 <RelativeLayout xmlns:
YungFan
2018/04/24
1.2K0
Android开发之SwipeRefreshLayout实现下拉刷新
ListView专题
ListView专题 1.ListView属性: fadingEdge属性 ListView上边和下边有黑色的阴影,android : fadingEdge = "none"后就不会有阴影了 scrollbars属性,隐藏滚动条 android : scrollbars = "none" setVerticalScrollBarEnabled(true); fadeScrollbars属性 android : fadeScrollbars = "true" 设置此值为true就可以实现滚动
xiangzhihong
2018/01/26
1.1K0
【ViewPager的学习】一、简单使用
使用它需要引用一个库:android-support-v4.jar,add to build path。
张拭心 shixinzhang
2022/11/30
2800
ListView详解
当然还有其他adapter。个人认为至少掌握这两种。只是字符串就用ArrayAdapter,用到图文混排的就用自定义的
提莫队长
2019/02/21
1.2K0
android学习笔记----ListView和各种适配器简介
将数据库显示到ListView的小Demo源码地址:https://github.com/liuchenyang0515/ListView_DataBase
砖业洋__
2023/05/06
2.3K0
android学习笔记----ListView和各种适配器简介
推荐阅读
相关推荐
Carson带你学Android:全面解析列表ListView与AdapterView
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档