当前位置: 首页 > news >正文

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (三)

这是继之前文章:

  • Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (一)

  • Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (二)

的续篇。在今天的文章中,我将详述如何使用 ElasticsearchStore。这也是被推荐的使用方法。如果你还没有设置好自己的环境,请详细阅读第一篇文章。

创建应用并展示

安装包

#!pip3 install langchain

导入包

from dotenv import load_dotenv
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import ElasticsearchStore
from langchain.text_splitter import CharacterTextSplitter
from urllib.request import urlopen
import os, jsonload_dotenv()openai_api_key=os.getenv('OPENAI_API_KEY')
elastic_user=os.getenv('ES_USER')
elastic_password=os.getenv('ES_PASSWORD')
elastic_endpoint=os.getenv("ES_ENDPOINT")
elastic_index_name='elasticsearch-store'

添加文档并将文档分成段落

with open('workplace-docs.json') as f:workplace_docs = json.load(f)print(f"Successfully loaded {len(workplace_docs)} documents")

metadata = []
content = []for doc in workplace_docs:content.append(doc["content"])metadata.append({"name": doc["name"],"summary": doc["summary"],"rolePermissions":doc["rolePermissions"]})text_splitter = CharacterTextSplitter(chunk_size=50, chunk_overlap=0)
docs = text_splitter.create_documents(content, metadatas=metadata)

把数据写入到 Elasticsearch

from elasticsearch import Elasticsearchembeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)url = f"https://{elastic_user}:{elastic_password}@{elastic_endpoint}:9200"
connection = Elasticsearch(url, ca_certs = "./http_ca.crt", verify_certs = True)es = ElasticsearchStore.from_documents( docs,embedding = embeddings, es_url = url, es_connection = connection,index_name = elastic_index_name, es_user = elastic_user,es_password = elastic_password)

展示结果

def showResults(output):print("Total results: ", len(output))for index in range(len(output)):print(output[index])

Similarity / Vector Search (Approximate KNN Search) - ApproxRetrievalStrategy()

query = "work from home policy"
result = es.similarity_search(query=query)showResults(result)

Hybrid Search (Approximate KNN + Keyword Search) - ApproxRetrievalStrategy()

我们在 Kibana 的 Dev Tools 里打入如下的命令:

embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)es = ElasticsearchStore(es_url = url,es_connection = connection,es_user=elastic_user,es_password=elastic_password,embedding=embeddings,index_name=elastic_index_name,strategy=ElasticsearchStore.ApproxRetrievalStrategy(hybrid=True)
)es.similarity_search("work from home policy")

造成这个错误的原因是因为当前的 License 模式不支持 RRF。我们去 Kibana 启动当前的授权:

我们再次运行代码:

Exact KNN Search (Brute Force) - ExactRetrievalStrategy()

embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)es = ElasticsearchStore(es_url = url,es_connection = connection,es_user=elastic_user,es_password=elastic_password,embedding=embeddings,index_name=elastic_index_name,strategy=ElasticsearchStore.ExactRetrievalStrategy()
)es.similarity_search("work from home policy")

Index / Search Documents using ELSER - SparseVectorRetrievalStrategy()

在这个步骤中,我们需要启动 ELSER。有关 ELSER 的启动,请参阅文章 “Elasticsearch:部署 ELSER - Elastic Learned Sparse EncoderR”。

embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)es = ElasticsearchStore.from_documents(docs,es_url = url,es_connection = connection,es_user=elastic_user,es_password=elastic_password,index_name=elastic_index_name+"-"+"elser",strategy=ElasticsearchStore.SparseVectorRetrievalStrategy()
)es.similarity_search("work from home policy")

在运行完上面的代码后,我们可以在 Kibana 中进行查看所生成的字段:

上面代码的整个 jupyter notebook 可以在地址 https://github.com/liu-xiao-guo/semantic_search_es/blob/main/ElasticsearchStore.ipynb 下载。

http://www.lryc.cn/news/206266.html

相关文章:

  • 主流电商平台价格如何高频监测
  • Spring关于注解的使用
  • 图像处理入门 1(Introduction to image processing)
  • 中国大模型开源创新与合作的新篇章 | 2023 CCF中国开源大会
  • vue项目切换页面白屏的解决方案
  • 5G vs 4G
  • 【JavaEE重点知识归纳】第11节:认识异常
  • 一键自助建站系统api版系统源码
  • 全国三维数字化创新设计大赛湖北赛区省赛成功举办
  • OpenCV #以图搜图:均值哈希算法(Average Hash Algorithm)原理与实验
  • 博通BCM575系列RDMA网卡驱动bnxt_re分析(一)
  • 集合总结-
  • 【知识串联】概率论中的值和量(随机变量/数字特征/参数估计)【考研向】【按概率论学习章节总结】
  • 上游服务不可用了,下游服务如何应对?
  • WebGL笔记:矩阵的变换之平移的实现
  • XTU-OJ 1187-Candy
  • 基于 nodejs+vue城市轨道交通线路查询系统mysql
  • 电商时代,VR全景如何解决实体店难做没流量?
  • 操作系统-浅谈CPU与内存
  • K8s 部署 CNI 网络组件+k8s 多master集群部署+负载均衡
  • 若依微服务上传图片文件代理配置
  • 物联网与 Linux 的相爱相生
  • python自动化测试(一):操作浏览器
  • NReco.LambdaParser使用案例
  • 苹果IOS安装IPA, plist形式 Safari 浏览器点击安装
  • Django 注册及创建订单商品
  • 15、Python -- 阶段总结:变量与流程控制
  • 信息检索与数据挖掘 | 【实验】排名检索模型
  • 玩转AIGC:打造令人印象深刻的AI对话Prompt
  • uniapp vue国际化 i18n