当前位置: 首页 > 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 (二)
  • 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, 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='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 Elasticsearchurl = 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 OpenAIchat = ChatOpenAI()messages = [HumanMessage(content=q)
]gpt_res = chat(messages)# Question with RAGgpt_rag_res = chain.invoke(q)# Responsess = 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.lryc.cn/news/208695.html

相关文章:

  • YOLOv7优化:渐近特征金字塔网络(AFPN)| 助力小目标检测
  • J2EE项目部署与发布(Windows版本)
  • 使用AWS Lambda函数的最佳实践!
  • 【计算机毕设小程序案例】基于SpringBoot的小演员招募小程序
  • 老年少女测试媛入职感想
  • StreamSaver.js入门教程:优雅解决前端下载文件的难题
  • element-ui vue2 iframe 嵌入外链新解
  • win10 + VS2017 编译libjpeg(jpeg-9b)
  • 如何实现公网远程桌面访问Ubuntu?VNC+cpolar内网穿透!
  • SpringMvc接收参数
  • 计算机网络文章荟萃
  • C# Socket通信从入门到精通(4)——多个异步TCP客户端C#代码实现
  • GitHub为自己的仓库(Repository)设置默认代码缩进(tabsize)
  • Tomcat的动静分离
  • Chimera:混合的 RLWE-FHE 方案
  • MySQL 连接出现 Authentication plugin ‘caching_sha2_password的处理方法(使用第二种)
  • 设置Ubuntu 20.04的静态IP地址(wifi模式下)
  • Qt界面实现中英文切换
  • Python 编写确定个位、十位以上方法及各数位的和程序
  • AI 引擎系列 1 - 从 AI 引擎工具开始(2022.1 更新)
  • Android Kotlin 协程初探 | 京东物流技术团队
  • MySQL-DQL【数据查询语言】(图码结合)
  • HTTP 响应状态码介绍
  • vtk 绘制等高线
  • N-129基于springboot,vue学生宿舍管理系统
  • 力扣每日一题70:爬楼梯
  • 分布式合集
  • MySQL比较两个表数据的差异
  • hive使用中的参数优化与问题排查
  • Leetcode—66.加一【简单】