当前位置:   article > 正文

Elasticsearch:使用 Gemini、Langchain 和 Elasticsearch 进行问答

Elasticsearch:使用 Gemini、Langchain 和 Elasticsearch 进行问答

本教程演示如何使用 Gemini API创建 embeddings 并将其存储在 Elasticsearch 中。 我们将学习如何将 Gemini 连接到 Elasticsearch 中存储的私有数据,并使用 Langchian 构建问答功能。

准备

Elasticsearch 及 Kibana

如果你还没有安装好自己的 Elasticsearch 及 Kibana 的话,请参阅如下的文章来进行安装:

在安装的时候,请参照 Elastic Stack 8.x 的文章来进行安装。

Gemini 开发者 key

你可以参考文章 来申请一个免费的 key 供下面的开发。你也可以直接去地址进行申请。

设置环境变量

我们在 termnial 中打入如下的命令来设置环境变量:

  1. export ES_USER=elastic
  2. export ES_PASSWORD=-M3aD_m3MHCZNYyJi_V2
  3. export GOOGLE_API_KEY=YourGoogleAPIkey

拷贝 Elasticsearch 证书

我们把 Elasticsearch 的证书拷贝到当前的目录下:

  1. $ pwd
  2. /Users/liuxg/python/elser
  3. $ cp ~/elastic/elasticsearch-8.12.0/config/certs/http_ca.crt .

安装 Python 依赖包

pip3 install -q -U google-generativeai elasticsearch langchain langchain_google_genai

应用设计

我们在当前的工作目录下打入命令:

jupyter notebook

导入包

  1. import google.generativeai as genai
  2. import google.ai.generativelanguage as glm
  3. from elasticsearch import Elasticsearch, helpers
  4. from langchain.vectorstores import ElasticsearchStore
  5. from langchain.text_splitter import CharacterTextSplitter
  6. from langchain_google_genai import GoogleGenerativeAIEmbeddings
  7. from langchain_google_genai import ChatGoogleGenerativeAI
  8. from langchain.prompts import ChatPromptTemplate
  9. from langchain.prompts import PromptTemplate
  10. from langchain.schema.output_parser import StrOutputParser
  11. from langchain.schema.runnable import RunnablePassthrough
  12. from langchain.schema.runnable import RunnableLambda
  13. from langchain.schema import HumanMessage
  14. from urllib.request import urlopen
  15. from dotenv import load_dotenv
  16. import json, os

读取环境变量

  1. load_dotenv()
  2. GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY")
  3. ES_USER = os.getenv("ES_USER")
  4. ES_PASSWORD = os.getenv("ES_PASSWORD")
  5. elastic_index_name='gemini-qa'

写入文档

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

我们首先在地址下载示例数据集:

wget https://raw.githubusercontent.com/liu-xiao-guo/semantic_search_es/main/datasets/data.json

其中的一个文档的内容如下:

  1. $ pwd
  2. /Users/liuxg/python/elser
  3. $ ls datasets/
  4. data.json
  1. # Load data into a JSON object
  2. with open('./datasets/data.json') as f:
  3. workplace_docs = json.load(f)
  4. print(f"Successfully loaded {len(workplace_docs)} documents")

将文档拆分为段落

  1. metadata = []
  2. content = []
  3. for doc in workplace_docs:
  4. content.append(doc["content"])
  5. metadata.append({
  6. "name": doc["name"],
  7. "summary": doc["summary"],
  8. "rolePermissions":doc["rolePermissions"]
  9. })
  10. text_splitter = CharacterTextSplitter(chunk_size=50, chunk_overlap=0)
  11. docs = text_splitter.create_documents(content, metadatas=metadata)

使用 Gemini Embeddings 将文档索引到 Elasticsearch

  1. url = f"https://{ES_USER}:{ES_PASSWORD}@192.168.0.3:9200"
  2. connection = Elasticsearch(
  3. hosts=[url],
  4. ca_certs = "./http_ca.crt",
  5. verify_certs = True
  6. )
  7. print(connection.info())
  8. embeddings = GoogleGenerativeAIEmbeddings(
  9. model="models/embedding-001", task_type="retrieval_document"
  10. )
  11. es = ElasticsearchStore.from_documents(
  12. docs,
  13. embedding = embeddings,
  14. es_url = url,
  15. es_connection = connection,
  16. index_name = elastic_index_name,
  17. es_user = ES_USER,
  18. es_password = ES_PASSWORD)

运行完上面的代码后,我们可以去 Kibana 中进行查看:

创建 retriever

更多搜索的方法可以参考 “Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四)”。

  1. embeddings = GoogleGenerativeAIEmbeddings(
  2. model="models/embedding-001", task_type="retrieval_query"
  3. )
  4. retriever = es.as_retriever(search_kwargs={"k": 3})

如果你不用去写入文档(没有上一步的 es),那么你可以使用如下的方法创建 es:

  1. es = ElasticsearchStore(
  2. es_connection=connection,
  3. embedding=embedding,
  4. index_name=elastic_index_name
  5. )

格式化文档

  1. def format_docs(docs):
  2. return "\n\n".join(doc.page_content for doc in docs)

使用 Prompt Template+gemini-pro 模型创建一条链

  1. template = """Answer the question based only on the following context:\n
  2. {context}
  3. Question: {question}
  4. """
  5. prompt = ChatPromptTemplate.from_template(template)
  6. chain = (
  7. {"context": retriever | format_docs, "question": RunnablePassthrough()}
  8. | prompt
  9. | ChatGoogleGenerativeAI(model="gemini-pro", temperature=0.7)
  10. | StrOutputParser()
  11. )
  12. chain.invoke("what is our sales goals?")

最终的的 notebook 可以在地址找到:https://github.com/liu-xiao-guo/semantic_search_es/blob/main/QA_using_Gemini_Langchain_Elasticsearch.ipynb

跟多阅读: 快速入门:使用 Gemini Embeddings 和 Elasticsearch 进行向量搜索

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/144832?site
推荐阅读
相关标签
  

闽ICP备14008679号