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

news2024/9/27 7:25:35

这篇博客是之前文章:

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

的续篇。在这篇文章中,我们将学习如何把从 Elasticsearch 搜索到的结果传递到大数据模型以得到更好的结果。

如果你还没有创建好自己的环境,请参考第一篇文章进行详细地安装。

创建应用并展示

安装包

#!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 langchain.prompts import ChatPromptTemplate
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.schema.output_parser import StrOutputParser
from langchain.schema.runnable import RunnablePassthrough
from langchain.schema.runnable import RunnableLambda
from langchain.schema import HumanMessage
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='langchain-rag'

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

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)

Index Documents using ELSER - SparseVectorRetrievalStrategy()

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)

es = ElasticsearchStore.from_documents(
    docs,
    es_url = url,
    es_connection = connection,
    es_user=elastic_user,
    es_password=elastic_password,
    index_name=elastic_index_name,
    strategy=ElasticsearchStore.SparseVectorRetrievalStrategy()
)

如果你还没有配置好自己的 ELSER,请参考之前的文章 “ Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (三)”。

在执行完上面的命令后,我们可以在 Kibana 中进行查看:

展示结果

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

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

RAG with Elasticsearch - Method 1 (Using Retriever)

retriever = es.as_retriever(search_kwargs={"k": 4})

template = """Answer the question based only on the following context:
{context}

Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)

chain = (
    {"context": retriever, "question": RunnablePassthrough()} 
    | prompt 
    | ChatOpenAI() 
    | StrOutputParser()
)

chain.invoke("vacation policy")

RAG with Elasticsearch - Method 2 (Without Retriever)

Add Context

def add_context(question: str):
    r = es.similarity_search(question)
    
    context = "\n".join(x.page_content for x in r)
    
    return context

Chain

template = """Answer the question based only on the following context:
{context}

Question: {question}
"""

prompt = ChatPromptTemplate.from_template(template)

chain = (
    {"context": RunnableLambda(add_context), "question": RunnablePassthrough()}
    | prompt
    | ChatOpenAI()
    | StrOutputParser()
)

chain.invoke("canada employees guidelines")

Compare with RAG and without RAG

q = input("Ask Question: ")

## Question to OpenAI

chat = ChatOpenAI()

messages = [
    HumanMessage(
        content=q
    )
]

gpt_res = chat(messages)

# Question with RAG

gpt_rag_res = chain.invoke(q)


# Responses

s = f"""
ChatGPT Response:

{gpt_res}

ChatGPT with RAG Response:

{gpt_rag_res}
"""

print(s)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1133516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决Linux下编译Intel oneTBB动态库出错的问题

在CMakeLists.txt中,原来有一段这样查找和链接的配置代码 find_library(tbblibaray ${tbb_path}) target_link_libraries(backalarm ${tbblibaray})编译后提示错误: /myapp/library/tbb/libtbb.so:对‘__cxa_throw_bad_array_new_lengthCX…

MATLAB源码-第55期】matlab代码基于m序列的多用户跳频通信系统仿真,输出各节点波形图。

操作环境: MATLAB 2022a 1、算法描述 1.跳频扩频调制 跳频扩频调制通过伪随机地改变发送载波频率,用跳变的频率来调制基带信号,得到载波频率不断变化的射频信号。 通常,跳频系统的频率合成器输出什么频率的载波信号是受跳频指…

harrypotter1-aragog靶机攻略

harrypotter1 扫描 nmap 指纹 目录 渗透 找到了登录位置 看到wordpress就用wpscan扫一扫 wpscan --url"http://10.4.7.153/blog" -e p --plugins-detection aggressive --api-tokend1fuMZc2tbhJWYk9VfNsl0GZlyYxkfH6bpL0pCKFhok扫描出有这些file manager漏洞 使用…

remount of the / superblock failed: Permission denied remount failed

雷电模拟器 挂载/system未读写总是失败 F:\Program\leidian\LDPlayer9>adb remount remount of the / superblock failed: Permission denied remount failed设置配置system.vmdk可写入 F:\Program\leidian\LDPlayer9>adb remount remount succeeded参考: https://www.…

排序-表排序

当我们需要对一个很大的结构体进行排序时,因为正常的排序需要大量的交换,这就会造成时间复杂度的浪费 因此,我们引入指针,通过指针临时变量的方式来避免时间复杂度的浪费 间接排序-排序思路:通过开辟一个指针数组&…

CRD2 值得一读的知识蒸馏与对比学习结合的paper 小陈读paper

一定要读 真的是不一样的收获啊 不知道 屏幕前的各位get到了没有 Hinton et al. (2015) introduced the idea of temperature in the softmax outputs to better represent smaller probabilities in the output of a single sample. Hinton等人(2015)引入了softmax输出中温…

泛型进阶-Java

文章目录 一、泛型的定义和引出1.1 定义1.2 引出泛型 二、泛型类使用2.1 语法2.2 示例2.3 类型推导三、裸类型(了解) 四、泛型编译原理4.1 擦除机制4.2 为什么不能实例化泛型类数组 五、泛型上界5.1 语法5.2 示例5.3 复杂示例 六、泛型方法6.1 定义语法6…

细谈MySQL的一些经典问题(一)

在MySQL中INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 有什么区别? 在MySQL中,INNER JOIN、LEFT JOIN(或LEFT OUTER JOIN)、RIGHT JOIN(或RIGHT OUTER JOIN)和 FULL JOIN(或FULL OUTER JOI…

C++------继承

目录 一、什么是继承 二、继承的方式 1.基类private成员在派生类无论什么继承都不可见 2.基类成员只想在派生类访问,不想在类外访问用protect 3.基类的其他成员在子类的访问方式 4.默认的继承方式 三、基类和派生类对象赋值转换 四.继承中的作用域 五.派…

vxe-table 打包部署上线,校验样式失效

正常效果 打包上线后的样式 样式失效原因,vue版本与vxe-table版本不兼容导致 版本 "vxe-table": "^4.3.5", "vxe-table-plugin-element": "^3.0.6", "xe-utils": "^3.5.4",由于vxe-table最新版本是4…

arco-disign vue + vue3 封装一个“下拉多组单选组件”

手搓一个下拉框多组单选组件, 实现采用框架 arco-disign vue + vue3 组件采用:a-popover、a-input-tag、a-radio-group、a-radio 实现效果: 调用组件 <SelectGroupRadiov-model="searchModel.indicatorScreening":options="dict.indicatorScreening&qu…

【可视化Java GUI程序设计教程】第4章 布局设计

4.1 布局管理器概述 右击窗体&#xff0c;单击快捷菜单中的Set Layout 4.1.2 绝对布局&#xff08;Absolute Layout&#xff09; 缩小窗口发现超出窗口范围的按钮看不见 Absolute Layout 4.1.2 空值布局&#xff08;Null Layout&#xff09; 4.1.3 布局管理器的属性和组件布…

盘点算法比赛中常见的AutoEDA工具库

在完成竞赛和数据挖掘的过程中&#xff0c;数据分析一直是非常耗时的一个环节&#xff0c;但也是必要的一个环节。 能否使用一个工具代替人来完成数据分析的过程呢&#xff0c;现有的AutoEDA工具可以一定程度上完成上述过程。本文将盘点常见的AutoEDA工具&#xff0c;欢迎收藏转…

C#中Redis使用简单教程

C#开发者的Redis入门指南 Redis是一个高性能的内存数据库&#xff0c;常用于缓存、队列、实时数据分析等场景。作为一个C#开发者&#xff0c;了解如何使用Redis可以为你的应用程序带来巨大的好处。本文将向你介绍Redis基本概念&#xff0c;并提供一些C#的代码示例来帮助你入门…

[SpringCloud] Eureka 与 Ribbon 简介

目录 一、服务拆分 1、案例一&#xff1a;多端口微服务 2、案例二&#xff1a;服务远程调用 二、Eureka 1、Eureka 原理分析 2、Eureka 服务搭建&#xff08;注册 eureka 服务&#xff09; 3、Eureka 服务注册&#xff08;注册其他服务&#xff09; 4、Eureka 服务发现…

Java学习 2.Java-数据类型与运算符

初识java回顾&#xff1a; java文件编译 一个java文件有类 类中有方法 java----->类----->方法 idea创建项目 改idea背景色 1. 2. 3. 数据类型与变量 1.字面常量 常量即程序运行期间&#xff0c;固定不变的量称为常量&#xff0c;字面值常量也是常量 字面常量…

uboot图像化配置操作说明

一. 简介 之前文章的学习&#xff0c; uboot 可以通过 mx6ull_alientek_emmc_defconfig 来配置&#xff0c;或者通过文 件 mx6ull_alientek_emmc.h 来配置 uboot 。 还有另外一种配置 uboot 的方法&#xff0c;就是图形化配置&#xff0c; 以前的 uboot 是不支持图…

02. 板载音频功能

核心&#xff1a;CS43L22&#xff0c; CS43L22是一款低功耗立体声数字/模拟转换器&#xff08;DAC&#xff09; 一、输入 &#xff08;1&#xff09;MEMS麦克风&#xff1a;芯片-MP45DT02 &#xff08;2&#xff09;外挂的U盘 &#xff08;3&#xff09;STM32F4的内部芯片存…

在CentOS 7中手工打造和运行xml文件配置的Servlet,然后使用curl、浏览器、telnet等三种工具各自测试

下载Openjdk并配置环境变量 https://jdk.java.net/java-se-ri/11-MR2是官网下载Openjdk 11的地方。 sudo wget https://download.java.net/openjdk/jdk11.0.0.1/ri/openjdk-11.0.0.1_linux-x64_bin.tar.gz下载openjdk 11。 sudo mkdir -p /usr/openjdk11创建目录&#xff…

【电路笔记】-交流电路中的功率

交流电路中的功率 文章目录 交流电路中的功率1、概述2、正弦波形的功率3、功率因数4、功率三角5、总结 1、概述 作为一般概念&#xff0c;功率描述了系统释放/传输一定量能量的速度。 这种能量可以有不同的形式&#xff1a;动能、磁能、电能……等。 因此&#xff0c;在任何域…