赞
踩
本文介绍可用于实现商品检索,商品相似度推荐,根据用户行为标签用户推荐。
使用之前需要对向量数据库和Embedding有一些基本的了解,目前国产的向量产品我体验下来发现腾讯的是封装的比较简单的,同时腾讯也开源了向量模型不需要我们自建,为小公司使用节约了资源。
具体什么是向量数据库我这就不过多介绍了,下面我们只讲在c#中如何实现。
需先申请腾讯向量数据库,目前是公测阶段不收取费用。但是需要申请审核。
开通Embedding功能,此功能是根据模型数据向量化。
可以直接登录在腾讯数据库控制台创建db也可以通过接口创建
创建一个collection用于存放数据
选择插入数据,此时我们并不知道需要插入的数据的向量值是多少,此功能插入会自动转化向量
然后我们就可以通过查询接口查询到数据了
下载地址
使用方法
/// <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);
}
}
查询结果
猜你喜欢(商品相似度)查询时传入商品名称即可返回需要的相似商品。
用户行为分析得到用户的标签,然后根据标签返回相似的商品。、
本文章参考腾讯向量数据库有兴趣的同学可以共同研究下。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。