c#依赖腾讯向量数据库实现商品相似度检索

本文介绍可用于实现商品检索,商品相似度推荐,根据用户行为标签用户推荐。
使用之前需要对向量数据库和Embedding有一些基本的了解,目前国产的向量产品我体验下来发现腾讯的是封装的比较简单的,同时腾讯也开源了向量模型不需要我们自建,为小公司使用节约了资源。

具体什么是向量数据库我这就不过多介绍了,下面我们只讲在c#中如何实现。

具体实现方法如下

  1. 需先申请腾讯向量数据库,目前是公测阶段不收取费用。但是需要申请审核。
    在这里插入图片描述

  2. 开通Embedding功能,此功能是根据模型数据向量化。
    在这里插入图片描述

  3. 可以直接登录在腾讯数据库控制台创建db也可以通过接口创建
    在这里插入图片描述

  4. 创建一个collection用于存放数据
    在这里插入图片描述

  5. 选择插入数据,此时我们并不知道需要插入的数据的向量值是多少,此功能插入会自动转化向量
    在这里插入图片描述

  6. 然后我们就可以通过查询接口查询到数据了
    在这里插入图片描述

下面是c#中实现的代码

下载地址
使用方法

  /// <summary>
    /// 腾讯向量数据库api
    /// </summary>
    [Route("[controller]/[action]")]
    public class API_TencentVectorDBController : Controller
    {
        /// <summary>
        /// 创建库
        /// </summary>
        /// <param name="database"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult DataBaseCreate(string database)
        {
            var ret = DataBase_Handle.Create(database);
            return Json(ret);
        }

        /// <summary>
        /// 删除库
        /// </summary>
        /// <param name="database"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult DataBaseDrop(string database)
        {
            var ret = DataBase_Handle.Drop(database);
            return Json(ret);
        }

        /// <summary>
        /// 获取库
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult DataBaseGetList()
        {
            var ret = DataBase_Handle.GetList();
            return Json(ret);
        }

        /// <summary>
        /// 创建集合
        /// </summary>
        /// <param name="createEntity">集合基本对象,创建时indexes为空即可</param>
        /// <param name="embedding">向量对象</param>
        /// <param name="indexType">向量指定索引类型</param>
        /// <param name="dimension">指定向量维度[1,4096],如果配置Embedding则为空</param>
        /// <param name="metricType">指定向量之间距离度量的算法L2,IP,COSINE</param>
        /// <param name="fileds">其他字段</param>
        /// <param name="nlist">指索引中的聚类中心数量。取值类型:uint64。取值范围:[1,65536]</param>
        /// <param name="M">indexType类型为HNSW时为每个节点在检索构图中可以连接多少个邻居节点一般可是只为16,其余的则为 指乘积量化中每个子向量的维度</param>
        /// <param name="efConstruction">搜索时,指定寻找节点邻居遍历的范围。数值越大构图效果越好,构图时间越长一般可设置为200</param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CollectionCreate(Collection_Entity.CollectionEntity createEntity,string embedding, string indexType, int? dimension, string metricType, string fileds, int? nlist = null, int? M = 16, int? efConstruction = 200)
        {
            //向量信息
            if (!string.IsNullOrEmpty(embedding))
            {
                createEntity.embedding = JsonConvert.DeserializeObject<Collection_Entity.Embedding>(embedding);
            }

            //字段信息
            List<string> _fileds = new List<string> { };
            if (!string.IsNullOrEmpty(fileds))
            {
                _fileds = JsonConvert.DeserializeObject<List<string>>(fileds);
            }

            //创建向量集合
            var ret = Collection_Handle.Create(createEntity, indexType, dimension, metricType, _fileds, nlist, M, efConstruction);

            return Json(ret);
        }

        /// <summary>
        /// 删除集合
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CollectionDrop(MySQLCommon.MC_VectorDb.Tencent.Common.BaseEntity entity)
        {
            var ret = Collection_Handle.Drop(entity);
            return Json(ret);
        }

        /// <summary>
        /// 查询指定的库包含的所有集合
        /// </summary>
        /// <param name="database"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CollectionList(string database)
        {
            var ret = Collection_Handle.List(database);
            return Json(ret);
        }

        /// <summary>
        /// 获取集合信息
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CollectionDescribe(MySQLCommon.MC_VectorDb.Tencent.Common.BaseEntity entity)
        {
            var ret = Collection_Handle.Describe(entity);
            return Json(ret);
        }

        /// <summary>
        /// 清空指定集合的数据与索引
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult CollectionTruncate(MySQLCommon.MC_VectorDb.Tencent.Common.BaseEntity entity)
        {
            var ret = Collection_Handle.Truncate(entity);
            return Json(ret);
        }

        /// <summary>
        /// 清空指定集合的数据与索引
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult AliasSet(Alias_Entity.AliasBaseEntity entity)
        {
            var ret = Alias_Handle.Set(entity);
            return Json(ret);
        }

        /// <summary>
        /// 删除集合的别名
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult AliasDelete(Alias_Entity.AliasBaseEntity entity)
        {
            var ret = Alias_Handle.Delete(entity);
            return Json(ret);
        }

        /// <summary>
        /// 给 Collection 中插入向量数据。如果 Collection 在创建时,已配置 Embedding 参数,则仅需要插入文本信息,Embedding 服务会自动将文本信息转换为向量数据,存入数据库
        /// </summary>
        /// <param name="insert"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult DocumentInsert(Document_Entity.InsertDocumentsEntity insert)
        {
            var ret = Document_Handle.Insert(insert);
            return Json(ret);
        }

        /// <summary>
        /// 精确查找与查询条件完全匹配的向量
        /// </summary>
        /// <param name="query"></param>
        /// <param name="filter"></param>
        /// <param name="limit"></param>
        /// <param name="offset"></param>
        /// <param name="retrieveVector"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult DocumentQuery(Document_Entity.QueryResponDocumentEntity query,string filter, int limit = 100, int offset = 1,bool? retrieveVector=false)
        {
            if (query.query == null)
            {
                query.query = new Document_Entity.QueryResponDocumentEntity.Query
                {
                    limit = limit,
                    filter= filter,
                    offset = offset,
                    retrieveVector = retrieveVector
                };
            }
            var ret = Document_Handle.Query(query);
            return Json(ret);
        }

        /// <summary>
        /// 向量检索
        /// </summary>
        /// <param name="seach"></param>
        /// <param name="embeddingItems"></param>
        /// <param name="outputFields"></param>
        /// <param name="filter"></param>
        /// <param name="limit"></param>
        /// <param name="retrieveVector"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult DocumentSeach(Document_Entity.SeachResponDocumentEntity seach, string embeddingItems, string filter, string outputFields="[]", int limit = 10, bool? retrieveVector = false)
        {
            if (seach.search == null)
            {
                seach.search = new Document_Entity.SeachResponDocumentEntity.Search
                {
                    embeddingItems = JsonConvert.DeserializeObject<List<string>>(embeddingItems),
                    outputFields= JsonConvert.DeserializeObject<List<string>>(outputFields),
                    limit = limit,
                    filter = filter,
                    retrieveVector= retrieveVector
                };
            }
            var ret = Document_Handle.Seach(seach);
            return Json(ret);
        }

        /// <summary>
        /// 删除指定  id(Document ID)的文档
        /// </summary>
        /// <param name="delete"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult DocumentDelete(Document_Entity.DeleteResponDocumentEntity delete)
        {
            var ret = Document_Handle.Delete(delete);
            return Json(ret);
        }

        /// <summary>
        /// 字段更新
        /// </summary>
        /// <param name="u"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult DocumentUpdate(Document_Entity.UpdateResponDocumentEntity u)
        {
            var ret = Document_Handle.Update(u);
            return Json(ret);
        }

        /// <summary>
        /// 重建索引
        /// </summary>
        /// <param name="rebuild"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult IndexRebuild(Index_Entity.RebuildEntity rebuild)
        {
            var ret = Index_Handle.Rebuild(rebuild);
            return Json(ret);
        }


        /// <summary>
        /// 测试插入数据
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult TestInsert()
        {
            //int total = 0;
            //int totalZS = 0;
            //var goods = MC_Goods.GoodsHandle.Get_Goods_List(new MySQLCommon.WFHXNEW_MSQL.MC_Goods.GoodsHandle.Request_Goods_PageList { bid = 15313381803036672, isShelves = true }, ref total, ref totalZS);

            //先根据平台获取商品
            var resultStr = Common.NewRedis(Emun.redisEumn.商品信息).GetEntity<string>(15313386743795712 + "_Goods_Type_Group_Show");
            var groups_Goods = JsonConvert.DeserializeObject<List<Goods_Type_Group_Show_Class>>(resultStr);
            List<long?> _gids = new List<long?> { };
            //获取商品
            foreach (var item in groups_Goods)
            {
                foreach (var _item in item.goodList)
                {
                    _gids.Add(_item.gid);
                }
            }
            //获取可显示的数据
            var goods = MySQLCommon.WFHXNEW_MSQL.MC_Goods.GoodsHandle.Get_Goods_List_ByRdis(_gids);

            //插入数据
            Document_Entity.InsertDocumentsEntity insert = new Document_Entity.InsertDocumentsEntity
            {
                database = "goods",
                collection = "seach",
                buildIndex = true
            };
            List<object> documents = new List<object> { };
            foreach (var item in goods)
            {
                if (item.gtName != "测试")
                {
                    documents.Add(new { id = item.id.ToString(), text = item.title, title = item.title, short_title = item.short_title, gtName = item.gtName, imgs = item.list_imgs });
                }
            }
            insert.documents = documents;

            //调用接口
            var ret = Document_Handle.Insert(insert);

            return Json(ret);
        }
    }

查询结果
在这里插入图片描述

猜你喜欢(商品相似度)查询时传入商品名称即可返回需要的相似商品。

用户行为分析得到用户的标签,然后根据标签返回相似的商品。、

本文章参考腾讯向量数据库有兴趣的同学可以共同研究下。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值