Elasticsearch:带有自查询检索器的聊天机器人示例

这篇具有很好参考价值的文章主要介绍了Elasticsearch:带有自查询检索器的聊天机器人示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本工作簿演示了 Elasticsearch 的自查询检索器 (self-query retriever) 将问题转换为结构化查询并将结构化查询应用于 Elasticsearch 索引的示例。

在开始之前,我们首先使用 langchain 将文档分割成块,然后使用 ElasticsearchStore.from_documents 创建一个向量存储并将数据索引到 elasticsearch。

然后,我们将看到一些示例查询,展示了由 elasticsearch 驱动的自查询检索器的全部功能。

Elasticsearch:带有自查询检索器的聊天机器人示例,Elasticsearch,AI,Elastic,elasticsearch,大数据,搜索引擎,人工智能,全文检索,机器人

安装

如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考文章:

安装 Elasticsearch 及 Kibana

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

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch

  • Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana

在安装的时候,请选择 Elastic Stack 8.x 进行安装。在安装的时候,我们可以看到如下的安装信息:

Elasticsearch:带有自查询检索器的聊天机器人示例,Elasticsearch,AI,Elastic,elasticsearch,大数据,搜索引擎,人工智能,全文检索,机器人

Python 安装包

我们需要安装 Python 版本 3.6 及以上版本。我们还需要安装如下的 Python 安装包:

python3 -m pip install -qU lark elasticsearch langchain openai
$ pwd
/Users/liuxg/python/elser
$ python3 -m pip install -qU lark elasticsearch langchain openai
$ pip3 list | grep elasticsearch
elasticsearch             8.11.1
rag-elasticsearch         0.0.1        /Users/liuxg/python/rag-elasticsearch/my-app/packages/rag-elasticsearch

在本练习中,我们将使用最新的 Elastic Stack 8.11 来进行展示。

环境变量

在启动 Jupyter 之前,我们设置如下的环境变量:

export ES_USER="elastic"
export ES_PASSWORD="yarOjyX5CLqTsKVE3v*d"
export ES_ENDPOINT="localhost"
export OPENAI_API_KEY="YOUR_OPEN_AI_KEY"

请在上面修改相应的变量的值。特别是你需要输入自己的 OPENAI_API_KEY。

拷贝 Elasticsearch 证书

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

$ pwd
/Users/liuxg/python/elser
$ cp ~/elastic/elasticsearch-8.11.0/config/certs/http_ca.crt .
overwrite ./http_ca.crt? (y/n [n]) y
$ ls http_ca.crt 
http_ca.crt

创建应用

导入 python 包

我们在当前的目录下创建 jupyter notebook:Chatbot Example with Self Query Retriever.ipynb

from langchain.schema import Document
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import ElasticsearchStore
from langchain.llms import OpenAI
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain.chains.query_constructor.base import AttributeInfo

Elasticsearch:带有自查询检索器的聊天机器人示例,Elasticsearch,AI,Elastic,elasticsearch,大数据,搜索引擎,人工智能,全文检索,机器人

创建文档

接下来,我们将使用 langchain 模式文档创建包含电影摘要的文档列表,其中包含每个文档的 page_content 和元数据。

docs = [
    Document(
        page_content="A bunch of scientists bring back dinosaurs and mayhem breaks loose",
        metadata={"year": 1993, "rating": 7.7, "genre": "science fiction", "director": "Steven Spielberg", "title": "Jurassic Park"},
    ),
    Document(
        page_content="Leo DiCaprio gets lost in a dream within a dream within a dream within a ...",
        metadata={"year": 2010, "director": "Christopher Nolan", "rating": 8.2, "title": "Inception"},
    ),
    Document(
        page_content="A psychologist / detective gets lost in a series of dreams within dreams within dreams and Inception reused the idea",
        metadata={"year": 2006, "director": "Satoshi Kon", "rating": 8.6, "title": "Paprika"},
    ),
    Document(
        page_content="A bunch of normal-sized women are supremely wholesome and some men pine after them",
        metadata={"year": 2019, "director": "Greta Gerwig", "rating": 8.3, "title": "Little Women"},
    ),
    Document(
        page_content="Toys come alive and have a blast doing so",
        metadata={"year": 1995, "genre": "animated", "director": "John Lasseter", "rating": 8.3, "title": "Toy Story"},
    ),
    Document(
        page_content="Three men walk into the Zone, three men walk out of the Zone",
        metadata={
            "year": 1979,
            "rating": 9.9,
            "director": "Andrei Tarkovsky",
            "genre": "science fiction",
            "rating": 9.9,
            "title": "Stalker",
        },
    ),
]

连接到 Elasticsearch

我们将使用我们本地构建的 Elasticsearch 集群进行连接。我们可以参考之前的文章 “Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (三)”。

from dotenv import load_dotenv
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import ElasticKnnSearch
from langchain.text_splitter import CharacterTextSplitter
from urllib.request import urlopen
import os, json
 
load_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='elastic-knn-search'
from elasticsearch import Elasticsearch
 
url = f"https://{elastic_user}:{elastic_password}@{elastic_endpoint}:9200"
connection = Elasticsearch(url, ca_certs = "./http_ca.crt", verify_certs = True)
 
print(connection.info())
 
embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
dims=1536
 

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)

Elasticsearch:带有自查询检索器的聊天机器人示例,Elasticsearch,AI,Elastic,elasticsearch,大数据,搜索引擎,人工智能,全文检索,机器人

设置查询检索器

接下来,我们将通过提供有关文档属性的一些信息和有关文档的简短描述来实例化自查询检索器。

然后我们将使用 SelfQueryRetriever.from_llm 实例化检索器 (retriever)

metadata_field_info = [
    AttributeInfo(
        name="genre",
        description="The genre of the movie. Can be either 'science fiction' or 'animated'.",
        type="string or list[string]",
    ),
    AttributeInfo(
        name="year",
        description="The year the movie was released",
        type="integer",
    ),
    AttributeInfo(
        name="director",
        description="The name of the movie director",
        type="string",
    ),
    AttributeInfo(
        name="rating", description="A 1-10 rating for the movie", type="float"
    ),
]

document_content_description = "Brief summary of a movie"

# Set up openAI llm with sampling temperature 0
llm = OpenAI(temperature=0, openai_api_key=openai_api_key)

# instantiate retriever
retriever = SelfQueryRetriever.from_llm(
    llm, es, document_content_description, metadata_field_info, verbose=True
)

使用自查询检索器回答问题

现在我们将演示如何使用 RAG 的自查询检索器。

from langchain.chat_models import ChatOpenAI
from langchain.schema.runnable import RunnableParallel, RunnablePassthrough
from langchain.prompts import ChatPromptTemplate, PromptTemplate
from langchain.schema import format_document

LLM_CONTEXT_PROMPT = ChatPromptTemplate.from_template("""
Use the following context movies that matched the user question. Use the movies below only to answer the user's question.

If you don't know the answer, just say that you don't know, don't try to make up an answer.

----
{context}
----
Question: {question}
Answer:
""")

DOCUMENT_PROMPT = PromptTemplate.from_template("""
---
title: {title}                                                                                   
year: {year}  
director: {director}    
---
""")

def _combine_documents(
    docs, document_prompt=DOCUMENT_PROMPT, document_separator="\n\n"
):
    doc_strings = [format_document(doc, document_prompt) for doc in docs]
    return document_separator.join(doc_strings)


_context = RunnableParallel(
    context=retriever | _combine_documents,
    question=RunnablePassthrough(),
)

chain = (_context | LLM_CONTEXT_PROMPT | llm)

chain.invoke("What movies are about dreams and it was released after the year 2009 but before the year 2011?")

Elasticsearch:带有自查询检索器的聊天机器人示例,Elasticsearch,AI,Elastic,elasticsearch,大数据,搜索引擎,人工智能,全文检索,机器人

上面的代码可以在地址:https://github.com/liu-xiao-guo/semantic_search_es/blob/main/Chatbot%20Example%20with%20Self%20Query%20Retriever.ipynb下载。文章来源地址https://www.toymoban.com/news/detail-780593.html

到了这里,关于Elasticsearch:带有自查询检索器的聊天机器人示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Elasticsearch:使用 LangChain 对话链和 OpenAI 的聊天机器人

    在此笔记本中,我们将构建一个聊天机器人,它可以回答有关自定义数据的问题,例如雇主的政策。 聊天机器人使用 LangChain 的 ConversationalRetrievalChain,具有以下功能: 用自然语言回答问题 在 Elasticsearch 中运行混合搜索以查找回答问题的文档 使用 OpenAI LLM 提取并总结答案 保

    2024年02月03日
    浏览(34)
  • Elasticsearch:聊天机器人、人工智能和人力资源:电信公司和企业组织的成功组合

    作者:来自 Elastic Jürgen Obermann, Piotr Kobziakowski 让我们来谈谈大型企业人力资源领域中一些很酷且改变游戏规则的东西:生成式 AI 和 Elastic Stack 的绝佳组合。 现在,想象一下大型电信公司的典型人力资源部门 — 他们正在处理一百万件事情,对吗? 从回答无休止的员工查询到

    2024年01月24日
    浏览(54)
  • 机器人现有力控技术检索

    1.1 直接力控 针对外力进行直接控制,其核心是 通过操作期望力与测量力之间差值的方式实现相应力控 期望力的值该怎么给 在绝大多数的实际应用中,我们都是优先给予机器人位置轨迹的指令,而具体期望力的数值大小是极难直接精确给出的; 用手去抓握一些柔软易形变的

    2024年04月25日
    浏览(21)
  • 聊天机器人的机器人API:提供机器人API接口,使开发者能够方便地实现聊天机器人功能

    作者:禅与计算机程序设计艺术 聊天机器人的机器人API:提供机器人API接口,使开发者能够方便地实现聊天机器人功能 1.1. 背景介绍 随着人工智能技术的飞速发展,智能对话交互已逐渐成为各行各业的趋势。在各种智能场景中,聊天机器人作为一种创新的交流方式,为用户

    2024年02月15日
    浏览(43)
  • elasticsearch 基于ik分词器的分词查询和模糊匹配

    前言:elasticsearch 查询有很多,查询的条件有固定格式,返回结果提示不明确,让ES使用起来有点不方便的感觉,ES查询方式很多,简单介绍几种使用点的,实用的 此处简单梳理一下最常用的查询 模糊匹配查询 类似 mysql 语法中的 like ‘%value%’ 类似于百度的分词查询 将

    2024年02月16日
    浏览(29)
  • 中文聊天机器人

    目录 一、项目介绍 wukong-robot介绍 特点 二、环境搭建 三、安装配置 四、录制唤醒词并使用机器人  要说当前最火的技术肯定就是人工智能和物联网了。 很多的厂家都不是从头到尾都自己实现的  截少了一块最后一个算法叫隐马尔可夫(都是人名的音译) 想要搞这些一定要

    2024年02月09日
    浏览(30)
  • 聊天机器人简要理解

    身边的同事或多或少都在聊ChatGPT,这又使得学生时代训练模型的恐惧感开始支配我。说起聊天机器人,我们先熟悉一下不同对话系统的概念。 1、单轮对话 单轮与传统的问答系统相类似,是智能对话系统的初级应用。一般表现为一问一答的形式,用户提出问题或前发出请求,

    2024年02月03日
    浏览(31)
  • 智能聊天机器人的实现

    ChatGPT近期以强大的对话和信息整合能力风靡全网,可以写代码、改论文、讲故事,几乎无所不能,这让人不禁有个大胆的想法,能否用他的对话模型打造一个智能机器人,可以在与好友对话中给出意想不到的回应,而且再也不用担心女朋友影响我们 打游戏 工作了。 本项目是

    2024年02月15日
    浏览(30)
  • AI聊天机器人,一个就够了:文心一言、讯飞星火、通义千问AI聊天机器人深度对比(一)

    本次为第一部分的测评,综合结论: 讯飞星火 文心一言 = 通义千问 。 文本生成能力:文心一言 = 讯飞星火 通义千问,讯飞星火表现亮眼,文心一言作为国内AI聊天机器人的先发者,在创意写作方面略不尽如人意。 代码能力:文心一言 = 讯飞星火 = 通义千问。对于不是很复

    2024年02月02日
    浏览(37)
  • AI聊天机器人,一个就够了:文心一言、讯飞星火、通义千问AI聊天机器人深度对比(二)

    本次为第二部分的测评,第一部分的测评请点击这里。综合结论: :通义千问 讯飞星火 文心一言 。 逻辑推理能力:讯飞星火 = 通义千问 文心一言。对于基本的逻辑推理问题,三个AI聊天机器人都能通过测试。但对于稍高难度的逻辑推理问题,讯飞星火和通义千问的表现亮

    2024年02月01日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包