分类: 大数据
2024-05-24 11:48:46
             
      
          
            
              
			                
            
           
						
	本教程演示如何使用向量检索服务(dashvector),结合上的,来从0到1构建基于文本索引的构建 向量检索基础上的语义搜索能力。具体来说,我们将基于qq 浏览器搜索标题语料库(:qq browser query title corpus)进行实时的文本语义搜索,查询{banned}{banned}最佳佳相似的相关标题。
	
	
		
	
	
		什么是 embedding
	
	
		简单来说,embedding是一个多维向量的表示数组,通常由一系列数字组成。embedding可以用来表示任何数据,例如文本、音频、图片、视频等等,通过embedding我们可以编码各种类型的非结构化数据,转化为具有语义信息的多维向量,并在这些向量上进行各种操作,例如相似度计算、聚类、分类和推荐等。
	
	
		
	
	
		整体流程概述
	
	
		 
 
	
	
	
		
	
	
		具体操作流程
	
	
		前提条件
	
	
	
		
	
	
		1、环境安装
	
	
		
			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 = []
 
- 
				        for line in f:
 
- 
				            batch_docs.append(json.loads(line.strip()))
 
- 
				            if len(batch_docs) == size:
 
- 
				                yield batch_docs[:]
 
- 
				                batch_docs.clear()
 
- 
				
 
- 
				        if batch_docs:
 
- 
				            yield batch_docs
			
 
	
		
	
	
		
	
	
		3、通过 dashscope 生成 embedding 向量
	
	
		dashscope灵积模型服务通过标准的api提供了多种模型服务。其中支持文本embedding的模型中文名为通用文本向量,英文名为text-embedding-v1。我们可以方便的通过dashscope api调用来获得一段输入文本的embedding向量。 
	
	
		
			:
			
			
				    rsp = textembedding.call(model=textembedding.models.text_embedding_v1,
			
			
				                             input=text)
			
			
				    
			
			
				    embeddings = [record['embedding'] for record in rsp.output['embeddings']]
			
			
				    return embeddings if isinstance(text, list) else embeddings[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。 
	
	
		
			= client.create('sample', 1536)
			
			
				assert rsp
			
			
				
			
			
				collection = client.get('sample')
			
			
				assert collection
			
			
				
			
			
				batch_size = 10
			
			
				for docs in list(prepare_data('qbqtc/dataset/train.json', batch_size)):
			
			
				    # 批量 embedding
			
			
				    embeddings = generate_embeddings([doc['title'] for doc in docs])
			
			
				
			
			
				    # 批量写入数据
			
			
				    rsp = collection.insert(
			
			
				        [
			
			
				            doc(id=str(doc['id']), vector=embedding, fields={"title": doc['title']}) 
			
			
				            for doc, embedding in zip(docs, embeddings)
			
			
				        ]
			
			
				    )
			
			
				    assert rsp
			
		
	
	
		
	
	
		5、语义检索:向量查询
	
	
		在把qbqtc训练数据集里的title内容都写到dashvector服务上的集合里后,就可以进行快速的向量检索,实现“语义搜索”的能力。继续上面代码的例子,假如我们要搜索有多少和'应届生 招聘'相关的title内容,可以通过在dashvector上去查询'应届生 招聘',即可迅速获取与该查询语义相近的内容,以及对应内容与输入之间的相似指数。
	
	
		
			- 
				# 基于向量检索的语义搜索
 
- 
				rsp = collection.query(generate_embeddings('应届生 招聘'), output_fields=['title'])
 
- 
				
 
- 
				for doc in rsp.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 
			
 
		                                     
            
            
              
              阅读(469) | 评论(0) | 转发(0) |
			                
             
            
            
            
           
          		  
         
       
      
     
   
  
  
  
 
"));
function link(t){
     var href= $(t).attr('href');
     href ="?url=" encodeuricomponent(location.href);
     $(t).attr('href',href);
    //setcookie("returnouturl", location.href, 60, "/");
}