将 Amazon Bedrock 与 Elasticsearch 和 Langchain 结合使用

Amazon Bedrock 是一项完全托管的服务,通过单一 API 提供来自 AI21 Labs、Anthropic、Cohere、Meta、Stability AI 和 Amazon 等领先 AI 公司的高性能基础模型 (FMs) 选择,以及广泛的 构建生成式 AI 应用程序所需的功能,简化开发,同时维护隐私和安全。 由于 Amazon Bedrock 是无服务器的,因此你无需管理任何基础设施,并且可以使用你已经熟悉的 AWS 服务将生成式 AI 功能安全地集成和部署到你的应用程序中。

在此示例中,我们将文档拆分为段落,在 Elasticsearch 中索引该文档,使用 ELSER 执行语义搜索来检索相关段落。 通过相关段落,我们构建了上下文并使用 Amazon Bedrock 来回答问题。

  1. 安装包并导入模块

首先我们需要安装模块。 确保 python 安装的最低版本为 3.8.1。

diff 复制代码
!python3 -m pip install -qU langchain elasticsearch boto3

然后我们需要导入模块

javascript 复制代码
1.  from getpass import getpass
2.  from urllib.request import urlopen
3.  from langchain.vectorstores import ElasticsearchStore
4.  from langchain.text_splitter import CharacterTextSplitter
5.  from langchain.llms import Bedrock
6.  from langchain.chains import RetrievalQA
7.  import boto3
8.  import json

注意:boto3 是适用于 Python 的 AWS 开发工具包的一部分,并且需要使用 Bedrock LLM

  1. 初始化基岩客户端

要在 AWS 服务中授权,我们可以使用 ~/.aws/config 文件和配置凭证或将 AWS_ACCESS_KEY、AWS_SECRET_KEY、AWS_REGION 传递给 boto3 模块

我们的示例使用第二种方法。

ini 复制代码
1.  default_region = "us-east-1"
2.  AWS_ACCESS_KEY = getpass("AWS Acces key: ")
3.  AWS_SECRET_KEY = getpass("AWS Secret key: ")
4.  AWS_REGION = input(f"AWS Region [default: {default_region}]: ") or default_region

6.  bedrock_client = boto3.client(
7.      service_,
8.      region_name=AWS_REGION,
9.      aws_access_key_id=AWS_ACCESS_KEY,
10.      aws_secret_access_key=AWS_SECRET_KEY
11.  )
  1. 连接到 Elasticsearch

ℹ️ 我们为此 notebook 使用 Elasticsearch 的 Elastic Cloud 部署。 如果你没有 Elastic Cloud 部署,请在此处注册免费试用。

我们将使用 Cloud ID 来标识我们的部署,因为我们使用的是 Elastic Cloud 部署。 要查找你的部署的 Cloud ID,请转至 cloud.elastic.co/deployments 并选择你的部署。

我们将使用 ElasticsearchStore 连接到我们的 Elastic 云部署。 这将有助于轻松创建和索引数据。 在 ElasticsearchStore 实例中,将嵌入设置为 BedrockEmbeddings 以嵌入本示例中将使用的文本和 elasticsearch 索引名称。 在本例中,我们将 strategy 设置为 ElasticsearchStore.SparseVectorRetrievalStrategy(),因为我们使用此策略来拆分文档。

当我们使用 ELSER 时,我们使用 SparseVectorRetrievalStrategy 策略。 该策略使用 Elasticsearch 的稀疏向量检索来检索 top-k 结果。 Langchain 中还有更多其他 strategies 可以根据你的需要使用。

ini 复制代码
1.  CLOUD_ID = getpass("Elastic deployment Cloud ID: ")
2.  CLOUD_USERNAME = "elastic"
3.  CLOUD_PASSWORD = getpass("Elastic deployment Password: ")

5.  vector_store = ElasticsearchStore(
6.      es_cloud_id=CLOUD_ID,
7.      es_user=CLOUD_USERNAME,
8.      es_password=CLOUD_PASSWORD,
9.      index_,
10.      strategy=ElasticsearchStore.SparseVectorRetrievalStrategy()
11.  )
  1. 下载数据集

让我们下载示例数据集并反序列化文档。

ini 复制代码
1.  url = "https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/example-apps/chatbot-rag-app/data/data.json"

3.  response = urlopen(url)

5.  workplace_docs = json.loads(response.read())
  1. 将文档分割成段落

我们将把文档分成段落,以提高检索的特异性,并确保我们可以在最终问答提示的上下文窗口中提供多个段落。

在这里,我们将文档分块为 800 个标记段落,其中有 400 个标记重叠。

这里我们使用一个简单的拆分器,但 Langchain 提供了更高级的拆分器来减少上下文丢失的机会。

css 复制代码
1.  metadata = []
2.  content = []

4.  for doc in workplace_docs:
5.    content.append(doc["content"])
6.    metadata.append({
7.        "name": doc["name"],
8.        "summary": doc["summary"],
9.        "rolePermissions":doc["rolePermissions"]
10.    })

12.  text_splitter = CharacterTextSplitter(chunk_size=800, chunk_overlap=400)
13.  docs = text_splitter.create_documents(content, metadatas=metadata)
  1. 将数据索引到 Elasticsearch 中

接下来,我们将使用 ElasticsearchStore.from_documents 将数据索引到 elasticsearch。 我们将使用在创建云部署步骤中设置的云 ID、密码和索引名称值。

在实例中,我们将策略设置为 SparseVectorRetrievalStrategy()

注意:在开始索引之前,请确保你已在部署中下载并部署了 ELSER 模型,并且正在 ml 节点中运行。

ini 复制代码
1.  documents = vector_store.from_documents(
2.      docs,
3.      es_cloud_id=CLOUD_ID,
4.      es_user=CLOUD_USERNAME,
5.      es_password=CLOUD_PASSWORD,
6.      index_,
7.      strategy=ElasticsearchStore.SparseVectorRetrievalStrategy()
8.  )
  1. 初始 Bedrock 硕士

接下来,我们将初始化 Bedrock LLM。 在 Bedrock 实例中,将传递 bedrock_client 和特定 model_id:amazon.titan-text-express-v1、ai21.j2-ultra-v1、anthropic.claude-v2、cohere.command-text-v14 等。你可以看到列表 Amazon Bedrock 用户指南上的可用基本模型

ini 复制代码
1.  default_model_id = "amazon.titan-text-express-v1"
2.  AWS_MODEL_ID = input(f"AWS model [default: {default_model_id}]: ") or default_model_id
3.  llm = Bedrock(
4.      client=bedrock_client,
5.      model_id=AWS_MODEL_ID
6.  )
  1. 提出问题

现在我们已经将段落存储在 Elasticsearch 中并且 LLM 已初始化,我们现在可以提出问题来获取相关段落。

scss 复制代码
1.  retriever = vector_store.as_retriever()

3.  qa = RetrievalQA.from_llm(
4.      llm=llm,
5.      retriever=retriever,
6.      return_source_documents=True
7.  )

9.  questions = [10.      'What is the nasa sales team?',11.      'What is our work from home policy?',12.      'Does the company own my personal project?',13.      'What job openings do we have?',14.      'How does compensation work?'15.  ]
16.  question = questions[1]
17.  print(f"Question: {question}\n")

19.  ans = qa({"query": question})

21.  print("\033[92m ---- Answer ---- \033[0m")
22.  print(ans["result"] + "\n")
23.  print("\033[94m ---- Sources ---- \033[0m")
24.  for doc in ans["source_documents"]:
25.    print("Name: " + doc.metadata["name"])
26.    print("Content: "+ doc.page_content)
27.    print("-------\n")

尝试一下

Amazon Bedrock LLM 是一个功能强大的工具,可以通过多种方式使用。 你可以尝试使用不同的基本模型和不同的问题。 你还可以使用不同的数据集进行尝试,看看它的表现如何。 要了解有关 Amazon Bedrock 的更多信息,请查看文档。

你可以尝试在 Google Colab 中运行此示例。

相关推荐
Elastic 中国社区官方博客10 小时前
如何将数据从 AWS S3 导入到 Elastic Cloud - 第 3 部分:Elastic S3 连接器
大数据·elasticsearch·搜索引擎·云计算·全文检索·可用性测试·aws
掘金-我是哪吒10 小时前
微服务mysql,redis,elasticsearch, kibana,cassandra,mongodb, kafka
redis·mysql·mongodb·elasticsearch·微服务
研究是为了理解12 小时前
Git Bash 常用命令
git·elasticsearch·bash
晨欣15 小时前
Elasticsearch和Lucene之间是什么关系?(ChatGPT回答)
elasticsearch·chatgpt·lucene
筱源源21 小时前
Elasticsearch-linux环境部署
linux·elasticsearch
Elastic 中国社区官方博客1 天前
释放专利力量:Patently 如何利用向量搜索和 NLP 简化协作
大数据·数据库·人工智能·elasticsearch·搜索引擎·自然语言处理
Shenqi Lotus2 天前
ELK-ELK基本概念_ElasticSearch的配置
elk·elasticsearch
yeye198912242 天前
10-Query & Filtering 与多字符串多字段查询
elasticsearch
Narutolxy2 天前
精准优化Elasticsearch:磁盘空间管理与性能提升技巧20241106
大数据·elasticsearch·jenkins
谢小涛3 天前
ES管理工具Cerebro 0.8.5 Windows版本安装及启动
elasticsearch·es·cerebro