使用 ElasticSearch 作为知识库,存储向量及相似性搜索_elasticsearch cosinesimilarity(1)

这篇具有很好参考价值的文章主要介绍了使用 ElasticSearch 作为知识库,存储向量及相似性搜索_elasticsearch cosinesimilarity(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

下面基于上篇文章使用到的 Chinese-medical-dialogue-data 中文医疗对话数据作为知识内容进行实验。

本篇实验使用 ES 版本为:7.14.0

二、Chinese-medical-dialogue-data 数据集

GitHub 地址如下:

https://github.com/Toyhom/Chinese-medical-dialogue-data

数据分了 6 个科目类型:

使用 ElasticSearch 作为知识库,存储向量及相似性搜索_elasticsearch cosinesimilarity(1),2024年程序员学习,elasticsearch,大数据,搜索引擎

数据格式如下所示:

使用 ElasticSearch 作为知识库,存储向量及相似性搜索_elasticsearch cosinesimilarity(1),2024年程序员学习,elasticsearch,大数据,搜索引擎

其中 ask 为病症的问题描述,answer 为病症的回答。

由于数据较多,本次实验仅使用 IM_内科 数据的前 5000 条数据进行测试。

三、Embedding 模型

Embedding 模型使用开源的 chinese-roberta-wwm-ext-large ,该模型输出为 1024 维。

huggingface 地址:

https://huggingface.co/hfl/chinese-roberta-wwm-ext-large

基本使用如下:

from transformers import BertTokenizer, BertModel
import torch

模型下载的地址

model_name = ‘D:\AIGC\model\chinese-roberta-wwm-ext-large’

def embeddings(docs, max_length=300):
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)

对文本进行分词、编码和填充

input_ids = []
attention_masks = []
for doc in docs:
encoded_dict = tokenizer.encode_plus(
doc,
add_special_tokens=True,
max_length=max_length,
padding=‘max_length’,
truncation=True,
return_attention_mask=True,
return_tensors=‘pt’
)
input_ids.append(encoded_dict[‘input_ids’])
attention_masks.append(encoded_dict[‘attention_mask’])

input_ids = torch.cat(input_ids, dim=0)
attention_masks = torch.cat(attention_masks, dim=0)

前向传播

with torch.no_grad():
outputs = model(input_ids, attention_mask=attention_masks)

提取最后一层的CLS向量作为文本表示

last_hidden_state = outputs.last_hidden_state
cls_embeddings = last_hidden_state[:, 0, :]
return cls_embeddings

if name == ‘__main__’:
res = embeddings([“你好,你叫什么名字”])
print(res)
print(len(res))
print(len(res[0]))

运行后可以看到如下日志:

使用 ElasticSearch 作为知识库,存储向量及相似性搜索_elasticsearch cosinesimilarity(1),2024年程序员学习,elasticsearch,大数据,搜索引擎

四、ElasticSearch 存储向量

创建向量索引

PUT http://127.0.0.1:9200/medical_index

{
“settings”: {
“number_of_shards”: 3,
“number_of_replicas”: 1
},
“mappings”: {
“properties”: {
“ask_vector”: {
“type”: “dense_vector”,
“dims”: 1024
},
“ask”: {
“type”: “text”,
“analyzer”: “ik_max_word”,
“search_analyzer”: “ik_smart”
},
“answer”: {
“type”: “text”,
“analyzer”: “ik_max_word”,
“search_analyzer”: “ik_smart”
}
}
}
}

其中 dims 为向量的长度。

使用 ElasticSearch 作为知识库,存储向量及相似性搜索_elasticsearch cosinesimilarity(1),2024年程序员学习,elasticsearch,大数据,搜索引擎

查看创建的索引:

GET http://127.0.0.1:9200/medical_index

使用 ElasticSearch 作为知识库,存储向量及相似性搜索_elasticsearch cosinesimilarity(1),2024年程序员学习,elasticsearch,大数据,搜索引擎

数据存入 ElasticSearch

引入 ElasticSearch 依赖库:

pip install elasticsearch -i https://pypi.tuna.tsinghua.edu.cn/simple

from elasticsearch import Elasticsearch
from transformers import BertTokenizer, BertModel
import torch
import pandas as pd

def embeddings_doc(doc, tokenizer, model, max_length=300):
encoded_dict = tokenizer.encode_plus(
doc,
add_special_tokens=True,
max_length=max_length,
padding=‘max_length’,
truncation=True,
return_attention_mask=True,
return_tensors=‘pt’
)
input_id = encoded_dict[‘input_ids’]
attention_mask = encoded_dict[‘attention_mask’]

前向传播

with torch.no_grad():
outputs = model(input_id, attention_mask=attention_mask)

提取最后一层的CLS向量作为文本表示

last_hidden_state = outputs.last_hidden_state
cls_embeddings = last_hidden_state[:, 0, :]
return cls_embeddings[0]

def add_doc(index_name, id, embedding_ask, ask, answer, es):
body = {
“ask_vector”: embedding_ask.tolist(),
“ask”: ask,
“answer”: answer
}
result = es.create(index=index_name, id=id, doc_type=“_doc”, body=body)
return result

def main():

模型下载的地址

model_name = ‘D:\AIGC\model\chinese-roberta-wwm-ext-large’

ES 信息

es_host = “http://127.0.0.1”
es_port = 9200
es_user = “elastic”
es_password = “elastic”
index_name = “medical_index”

数据地址

path = “D:\AIGC\dataset\Chinese-medical-dialogue-data\Chinese-medical-dialogue-data\Data_数据\IM_内科\内科5000-33000.csv”

分词器和模型

tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)

ES 连接

es = Elasticsearch(
[es_host],
port=es_port,
http_auth=(es_user, es_password)
)

读取数据写入ES

data = pd.read_csv(path, encoding=‘ANSI’)
for index, row in data.iterrows():

写入前 5000 条进行测试

if index >= 500:
break
ask = row[“ask”]
answer = row[“answer”]

文本转向量

embedding_ask = embeddings_doc(ask, tokenizer, model)
result = add_doc(index_name, index, embedding_ask, ask, answer, es)
print(result)

if name == ‘__main__’:
main()

使用 ElasticSearch 作为知识库,存储向量及相似性搜索_elasticsearch cosinesimilarity(1),2024年程序员学习,elasticsearch,大数据,搜索引擎

五、相似性搜索

1. 余弦相似度算法:cosineSimilarity

from elasticsearch import Elasticsearch
from transformers import BertTokenizer, BertModel
import torch

def embeddings_doc(doc, tokenizer, model, max_length=300):
encoded_dict = tokenizer.encode_plus(
doc,
add_special_tokens=True,
max_length=max_length,
padding=‘max_length’,
truncation=True,
return_attention_mask=True,
return_tensors=‘pt’
)
input_id = encoded_dict[‘input_ids’]
attention_mask = encoded_dict[‘attention_mask’]

前向传播

with torch.no_grad():
outputs = model(input_id, attention_mask=attention_mask)

提取最后一层的CLS向量作为文本表示

last_hidden_state = outputs.last_hidden_state
cls_embeddings = last_hidden_state[:, 0, :]
return cls_embeddings[0]

def search_similar(index_name, query_text, tokenizer, model, es, top_k=3):
query_embedding = embeddings_doc(query_text, tokenizer, model)
print(query_embedding.tolist())
query = {
“query”: {
“script_score”: {
“query”: {“match_all”: {}},
“script”: {
“source”: “cosineSimilarity(params.queryVector, ‘ask_vector’) + 1.0”,
“lang”: “painless”,
“params”: {
“queryVector”: query_embedding.tolist()
}
}
}
},
“size”: top_k
}
res = es.search(index=index_name, body=query)
hits = res[‘hits’][‘hits’]
similar_documents = []
for hit in hits:
similar_documents.append(hit[‘_source’])
return similar_documents

def main():

模型下载的地址

model_name = ‘D:\AIGC\model\chinese-roberta-wwm-ext-large’

ES 信息

es_host = “http://127.0.0.1”
es_port = 9200
es_user = “elastic”
es_password = “elastic”
index_name = “medical_index”

分词器和模型

tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)

ES 连接

es = Elasticsearch(
[es_host],
port=es_port,
http_auth=(es_user, es_password)
)

query_text = “我有高血压可以拿党参泡水喝吗”

similar_documents = search_similar(index_name, query_text, tokenizer, model, es)
for item in similar_documents:
print(“================================”)
print(‘ask:’, item[‘ask’])
print(‘answer:’, item[‘answer’])

if name == ‘__main__’:
main()

打印日志如下:

使用 ElasticSearch 作为知识库,存储向量及相似性搜索_elasticsearch cosinesimilarity(1),2024年程序员学习,elasticsearch,大数据,搜索引擎

================================ ask: 我有高血压这两天女婿来的时候给我拿了些党参泡水喝,您好高血压可以吃党参吗? answer: 高血压病人可以口服党参的。党参有降血脂,降血压的作用,可以彻底消除血液中的垃圾,从而对冠心病以及心血管疾病的患者都有一定的稳定预防工作作用,因此平时口服党参能远离三高的危害。另外党参除了益气养血,降低中枢神经作用,调整消化系统功能,健脾补肺的功能。感谢您的进行咨询,期望我的解释对你有所帮助。

ask: 我准备过两天去看我叔叔,顺便带些人参,但是他有高血压,您好人参高血压可以吃吗? answer: 人参有一定的调压作用,主要用来气虚体虚的患者,如果有气血不足,气短乏力,神经衰弱,神经衰弱健忘等不适症状的话,可以适当口服人参调养身体,但是对于高血压的病人,如果长期食用人参的话,可能会对血压引发一定影响,所以,比较好到医院中医科实施辨证论治调治,看如何适合食用人参。

ask: 我妈妈有点高血压,比较近我朋友送了我一些丹参片,我想知道高血压能吃丹参片吗?
answer: 丹参片具备活血化瘀打通血管的作用可以致使血液粘稠度减低,所以就容易致使血管内血液供应便好防止出现血液粘稠,致使血压下降,所以对降血压是有一定帮助的,高血压患者是经常使用丹参片实施治疗的。可以预防,因为血液粘稠引来的冠心病心绞痛以及外周血管脑水肿症状。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
使用 ElasticSearch 作为知识库,存储向量及相似性搜索_elasticsearch cosinesimilarity(1),2024年程序员学习,elasticsearch,大数据,搜索引擎
使用 ElasticSearch 作为知识库,存储向量及相似性搜索_elasticsearch cosinesimilarity(1),2024年程序员学习,elasticsearch,大数据,搜索引擎
使用 ElasticSearch 作为知识库,存储向量及相似性搜索_elasticsearch cosinesimilarity(1),2024年程序员学习,elasticsearch,大数据,搜索引擎
使用 ElasticSearch 作为知识库,存储向量及相似性搜索_elasticsearch cosinesimilarity(1),2024年程序员学习,elasticsearch,大数据,搜索引擎
使用 ElasticSearch 作为知识库,存储向量及相似性搜索_elasticsearch cosinesimilarity(1),2024年程序员学习,elasticsearch,大数据,搜索引擎

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
使用 ElasticSearch 作为知识库,存储向量及相似性搜索_elasticsearch cosinesimilarity(1),2024年程序员学习,elasticsearch,大数据,搜索引擎

片转存中…(img-SVhQZqLx-1712552759258)]
[外链图片转存中…(img-dzge6J1x-1712552759258)]
[外链图片转存中…(img-Nv693j9X-1712552759259)]
[外链图片转存中…(img-ltsO6P3y-1712552759259)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-oTutXL7x-1712552759259)]文章来源地址https://www.toymoban.com/news/detail-848106.html

到了这里,关于使用 ElasticSearch 作为知识库,存储向量及相似性搜索_elasticsearch cosinesimilarity(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (一)AI本地知识库问答(可运行):LangChain+Chroma向量数据库+OpenAi大模型

    只需要看config目录下的config.py,data目录下的txt知识库文件,db向量数据库文件在持久化部署后会自动生成,route下的app.py,scripts目录下的Chroma向量库持久化部署.py这几个就可以,scripts目录下的考勤问答.py和test目录下都是单独的自己测试的小代码,可以不用关注 因为运行需要

    2024年02月03日
    浏览(34)
  • 【elasticsearch实战】知识库文件系统检索工具FSCrawler

    最近有一个需求需要建设一个知识库文档检索系统,这些知识库物料附件的文档居多,有较多文档格式如:PDF, Open Office, MS Office等,需要将这些格式的文件转化成文本格式,写入elasticsearch 的全文检索索引,方便搜索。 我这里介绍一种工具不考虑文件原来格式,但能方便将转

    2024年02月22日
    浏览(39)
  • 基于GPT3.5实现本地知识库解决方案-利用向量数据库和GPT向量接口-实现智能回复并限制ChatGPT回答的范围...

    标题有点长,但是基本也说明出了这篇文章的主旨,那就是利用GPT AI智能回答自己设置好的问题 既能实现自己的AI知识库机器人,又能节省ChatGPT调用的token成本费用。 代码仓库地址 document.ai: 基于GPT3.5的通用本地知识库解决方案 下面图片是整个流程: 导入知识库数据 利用

    2024年02月02日
    浏览(38)
  • KnowledgeGPT:利用检索和存储访问知识库上增强大型语言模型10.30

    大型语言模型(LLM)在自然语言处理领域展现出了令人印象深刻的影响,但它们仍然在几个方面存在问题,例如完整性、及时性、忠实度和适应性。尽管最近的研究工作集中在将LLM与外部知识源进行连接,但知识库(KB)的整合仍然研究不足且面临多个挑战。 本文介绍了Kno

    2024年02月06日
    浏览(33)
  • [Unity+文心知识库]使用百度智能云搭建私有知识库,集成知识库API,打造具备知识库的AI二次元姐姐

            最近从百度智能云的官方技术支持那边了解到,目前百度千帆大模型平台提供有在线的知识库功能,能够在线上传自己的私人知识库文档,并且配置文心一言模型作为文本生成的引擎,构建自己的私有知识库。之前自己搭建知识库都是用的langchain框架,在本地部署使

    2024年02月04日
    浏览(34)
  • springboot+elasticsearch+neo4j+vue+activiti数字知识库管理系统

    在数字化高度普及的时代,企事业机关单位在日常工作中会产生大量的文档,例如医院制度汇编,企业知识共享库等。针对这些文档性的东西,手工纸质化去管理是非常消耗工作量的,并且纸质化查阅难,易损耗,所以电子化管理显得尤为重要。 【springboot+elasticsearch+neo4j+v

    2024年02月09日
    浏览(36)
  • 使用Docker部署wikitten个人知识库

    Wikitten是一款开源Wiki知识管理系统,使用PHP开发,支持Markdown语法,无需数据库,自动生成树形目录,适合用来做个人Wiki知识库。 Wikitten 是一个小巧、快速的 PHP wiki。 Wikitten是存储您的笔记、代码片段、想法等的完美场所。 Wikitten是一款开源Wiki知识管理系统。 支持Markdown语

    2024年02月14日
    浏览(29)
  • 使用Langchain与ChatGLM实现本地知识库(二)

      大语言模型也只是将用户提供的大规模数据集训练而来,也并非万能的什么都知道,特别是一些小众知识、内部数据或私密的个人数据等,此时ChatGLM3肯定会胡乱回答就是ChatGPT4也不一定能给出满意回答;不少公司、个人都有自己的知识库或日志等此时如有可将这些数据以

    2024年02月05日
    浏览(40)
  • 使用chatglm搭建本地知识库AI_闻达

    最近大火的chatgpt,老板说让我看看能不能用自己的数据,回答专业一些,所以做了一些调研,最近用这个倒是成功推理了自己的数据,模型也开源了,之后有机会也训练一下自己的数据。 1.1双击打开anconda prompt创建虚拟环境 1.2下载pytorch(这里要根据自己的电脑版本下载)都

    2024年02月10日
    浏览(40)
  • 使用LangChain与ChatGLM实现本地知识库(一)

      本篇主要内容为介绍ChatGLM3的安装使用,后续才会涉及到使用LangChain实现本地知识库的内容;   ChatGLM为智谱与清华大学开源的一个大语言模型,支持多轮对话、内容创作等,ChatGLM3-6B为ChatGLM3系列中门槛相对较低的一个,本地部署提供兼容OpenAI的API;   LangChain用于快

    2024年02月05日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包