首页
免费后端云服务
关于
Search
1
小程序后端入门系列视频教程【一-微信开发工具介绍】
9,812 阅读
2
微信小程序三级联动之多列选择器
9,710 阅读
3
小程序开发免费后端之神秘利器分享
9,632 阅读
4
Golang-开发企业级资源权限管理【第一步表设计】-1
9,174 阅读
5
学会微信服务端开发第一步
9,049 阅读
日常记录
日常
随笔
Bmob后端云
从零开始学物联网
Serverless实战驾校小程序
心邮
Serverless
向量数据库
登录
Search
Typecho
累计撰写
124
篇文章
累计收到
22
条评论
首页
栏目
日常记录
日常
随笔
Bmob后端云
从零开始学物联网
Serverless实战驾校小程序
心邮
Serverless
向量数据库
页面
免费后端云服务
关于
搜索到
2
篇与
的结果
2016-01-29
基于向量检索服务与TextEmbedding实现语义搜索
本教程演示如何使用向量检索服务(DashVector),结合上的[EmbeddingAPI](https://help.aliyun.com/zh/dashscope/developer-reference/api-details-15),来从0到1构建基于文本索引的构建+向量检索基础上的语义搜索能力。具体来说,我们将基于QQ 浏览器搜索标题语料库(:QQBrowser Query Title Corpus)进行实时的文本语义搜索,查询{BANNED}{BANNED}最佳佳相似的相关标题。什么是 Embedding简单来说,Embedding是一个多维向量的表示数组,通常由一系列数字组成。Embedding可以用来表示任何数据,例如文本、音频、图片、视频等等,通过Embedding我们可以编码各种类型的非结构化数据,转化为具有语义信息的多维向量,并在这些向量上进行各种操作,例如相似度计算、聚类、分类和推荐等。整体流程概述Embedding:通过DashScope提供的通用文本向量模型,对语料库中所有标题生成对应的embedding向量。构建索引服务和查询:通过DashVector向量检索服务对生成embedding向量构建索引。将查询文本embedding向量作为输入,通过DashVector搜索相似的标题。具体操作流程前提条件开通灵积模型服务,并获得 API-KEY:开通DashScope并创建API-KEY。开通DashVector向量检索服务,并获得 API-KEYAPI-KEY管理。1、环境安装说明需要提前安装 Python3.7 及以上版本,请确保相应的 python 版本。 pip3 install dashvector dashscope 2、数据准备(QBQTC, QQ Browser Query Title Corpus),是QQ浏览器搜索引擎目前针对大搜场景构建的一个融合了相关性、权威性、内容质量、时效性等维度标注的学习排序(LTR)数据集,广泛应用在搜索引擎业务场景中。作为CLUE-beanchmark的一部分,QBQTC数据集可以直接从github上下载(训练集路径为dataset/train.json)。 git clone https://github.com/CLUEbenchmark/QBQTC.git wc-l QBQTC/dataset/train.json 数据集中的训练集(train.json)其格式为 json: { "id":0, "query":"小孩咳嗽感冒", "title":"小孩感冒过后久咳嗽该吃什么药育儿问答宝宝树", "label":"1" } 我们将从这个数据集中提取title,方便后续进行embedding并构建检索服务。 import json def prepare_data(path,size): with open(path,'r',encoding='utf-8')as f: batch_docs=[] forlineinf: batch_docs.append(json.loads(line.strip())) iflen(batch_docs)==size: yield batch_docs[:] batch_docs.clear() ifbatch_docs: yield batch_docs 3、通过 DashScope 生成 Embedding 向量DashScope灵积模型服务通过标准的API提供了多种模型服务。其中支持文本Embedding的模型中文名为通用文本向量,英文名为text-embedding-v1。我们可以方便的通过DashScope API调用来获得一段输入文本的embedding向量。说明需要使用您的api-key替换示例中的 your-dashscope-api-key ,代码才能正常运行。 import dashscope from dashscope import TextEmbedding dashscope.api_key='{your-dashscope-api-key}' def generate_embeddings(text): rsp=TextEmbedding.call(model=TextEmbedding.Models.text_embedding_v1, input=text) embeddings=[record['embedding']forrecordinrsp.output['embeddings']] return embeddingsifisinstance(text,list)elseembeddings[0] # 查看下embedding向量的维数,后面使用 DashVector 检索服务时会用到,目前是1536 print(len(generate_embeddings('hello'))) 4、通过 DashVector 构建检索:向量入库DashVector向量检索服务上的数据以集合(Collection)为单位存储,写入向量之前,我们首先需要先创建一个集合来管理数据集。创建集合的时候,需要指定向量维度,这里的每一个输入文本经过DashScope上的text_embedding_v1模型产生的向量,维度统一均为1536。DashVector 除了提供向量检索服务外,还提供倒排过滤功能 和 scheme free功能。所以我们为了演示方便,可以写入数据时,可以将title内容写入 DashVector 以便召回。写入数据还需要指定 id,我们可以直接使用 QBQTC中id。说明需要使用您的api-key替换示例中的 your-dashvector-api-key ,以及您的Cluster Endpoint替换示例中的your-dashvector-cluster-endpoint ,代码才能正常运行。 from dashvector import Client,Doc # 初始化 DashVector client client=Client( api_key='{your-dashvector-api-key}', endpoint='{your-dashvector-cluster-endpoint}' ) # 指定集合名称和向量维度 rsp=client.create('sample',1536) assert rsp collection=client.get('sample') assert collection batch_size=10 fordocsinlist(prepare_data('QBQTC/dataset/train.json',batch_size)): # 批量 embedding embeddings=generate_embeddings([doc['title']fordocindocs]) # 批量写入数据 rsp=collection.insert( [ Doc(id=str(doc['id']),vector=embedding,fields={"title":doc['title']}) fordoc,embeddinginzip(docs,embeddings) ] ) assert rsp 5、语义检索:向量查询在把QBQTC训练数据集里的title内容都写到DashVector服务上的集合里后,就可以进行快速的向量检索,实现“语义搜索”的能力。继续上面代码的例子,假如我们要搜索有多少和'应届生招聘'相关的title内容,可以通过在DashVector上去查询'应届生 招聘',即可迅速获取与该查询语义相近的内容,以及对应内容与输入之间的相似指数。 # 基于向量检索的语义搜索 rsp=collection.query(generate_embeddings('应届生 招聘'),output_fields=['title']) fordocinrsp.output: print(f"id: {doc.id}, title: {doc.fields['title']}, score: {doc.score}") id:0,title:实习生招聘-应届生求职网,score:2523.1582 id:6848,title:应届生求职网校园招聘yingjieshengcom中国领先的大学生求职网站,score:3053.7095 id:8935,title:北京招聘求职-前程无忧,score:5100.5684 id:5575,title:百度招聘实习生北京实习招聘,score:5451.4155 id:6500,title:中公教育招聘信息网-招聘岗位-近期职位信息-中公教育网,score:5656.128 id:7491,title:张家口招聘求职-前程无忧,score:5834.459 id:7520,title:前程无忧网北京前程无忧网招聘,score:5874.412 id:3214,title:乡镇卫生院招聘招聘乡镇卫生院招聘信息+-58同城,score:6005.207 id:6507,title:赶集网招聘实习生北京实习招聘,score:6424.9927 id:5431,title:实习内容安排百度文库,score:6505.735
2016年01月29日
33 阅读
0 评论
0 点赞
2016-01-10
html表格自定义显示列
后台统计,有个表,有60个字段要显示。这时如果页面一次性全部展示出来,大部分屏幕可能不够宽度。这时就需要固定表格列,但如果只是固定列,太多列了还是比较难查看自己需要的列,这时比较优的方案是,每个账号可以选择显示哪些列显示隐藏。http://www.layui.com/demo/table/fixed.html前端实现固定表格列,有很多插件框架实现,这里主要讲下,配合后端实现整个交互逻辑。相关技术点固定表格列字段选择穿梭框数据库保存隐藏字段固定表格列,这里用插件layuihttp://www.layui.com/demo/table/fixed.html字段选择穿梭框,使用 bootstrap的双边栏选择框http://www.jq22.com/jquery-info15984数据库保存隐藏字段,这个搭建用任何后端语言都可以实现,这里用PHP。代码,穿梭框与后端实现交互function getData(){ return new Promise(function(resolve, reject){ $.getJSON('/admin/ad/getField', {}, function (res) { field = res.tableFile console.log(res); resolve(res); //reject( }) }); } getData().then(function(res){ field = res.tableFile $(document).ready(function () { var demo2 = $('.demo').doublebox({ nonSelectedListLabel: '显示列', selectedListLabel: '隐藏列', preserveSelectionOnMove: 'moved', moveOnSelect: false, nonSelectedList: res.show, selectedList: res.hide, optionValue: "field", optionText: "fieldName", doubleMove: true, }); layui.use('table', function () { var table = layui.table; var w = document.body.scrollWidth - 50; var h = document.body.scrollHeight - 390; table.render({ elem: '#test', limit: 10 , url: '/admin/ad/getData?Ad[type]='+<?php echo isset($_GET['Ad']['type'])?intval($_GET['Ad']['type']):1 ?> , width: w , height: h , cols: [field] , page: true }); }); }) }); 后台API返回对应的显示列,即可,格式如下 { "show":[ { "field":"date", "fieldName":"时间" }, { "field":"clientName", "fieldName":"广告主名称" }, { "field":"adId", "fieldName":"广告id" }, { "field":"adName", "fieldName":"广告名称" }, { "field":"order_roi", "fieldName":"下单ROI" }, { "field":"quest_reservation_pv", "fieldName":"销售线索量" } ], "hide":[ { "field":"contract_flag", "fieldName":"购买类型" }, { "field":"pos_type", "fieldName":"广告位" }, { "field":"convclk_pv", "fieldName":"可转化点击次数" }, { "field":"convclk_cpc", "fieldName":"可转化点击成本" }, { "field":"clk_pv", "fieldName":"点击人数" }, { "field":"exp_pv_avg", "fieldName":"人均曝光次数" }, { "field":"img_uv", "fieldName":"图片点击人数" }, { "field":"play_pv", "fieldName":"视频点击次数" }, { "field":"play_uv", "fieldName":"视频点击人数" }, { "field":"detail_pv", "fieldName":"文字链点击次数" }, { "field":"ios_act_pv", "fieldName":"IOS激活次数" }, { "field":"download_complete_pv", "fieldName":"APP下载完成次数" }, { "field":"install_complete_pv", "fieldName":"APP安装完成次数" }, { "field":"app_act_pv", "fieldName":"APP激活次数" }, { "field":"app_reg_pv", "fieldName":"APP注册次数" }, { "field":"app_addtocart_pv", "fieldName":"APP加入购物车次数" }, { "field":"app_purchase_pv", "fieldName":"APP付费次数" }, { "field":"card_use_pv", "fieldName":"卡券使用次数" }, { "field":"share_page_pv", "fieldName":"广告分享次数" }, { "field":"share_page_uv", "fieldName":"广告分享人数" }, { "field":"nointerest_pv", "fieldName":"不感兴趣点击次数" } ], "tableFile":[ { "field":"date", "width":140, "title":"时间", "fixed":"left" }, { "field":"clientName", "width":140, "title":"广告主名称", "fixed":"left" }, { "field":"adId", "width":100, "title":"广告id", "fixed":"left" }, { "field":"adName", "width":140, "title":"广告名称", "fixed":"left" }, { "field":"balance", "width":140, "title":"余额", "fixed":"left" }, { "field":"quest_reservation_pv", "width":100, "title":"销售线索量" } ] }最终演示效果
2016年01月10日
6,186 阅读
0 评论
28 点赞