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:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (三)

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

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四),AI,Elasticsearch,Elastic,langchain,人工智能,elasticsearch,搜索引擎,大数据,全文检索

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

针对大文本的文档,我们可以采用如下的架构:

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四),AI,Elasticsearch,Elastic,langchain,人工智能,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")

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四),AI,Elasticsearch,Elastic,langchain,人工智能,elasticsearch,搜索引擎,大数据,全文检索

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)

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四),AI,Elasticsearch,Elastic,langchain,人工智能,elasticsearch,搜索引擎,大数据,全文检索

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()
)

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四),AI,Elasticsearch,Elastic,langchain,人工智能,elasticsearch,搜索引擎,大数据,全文检索

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

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

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四),AI,Elasticsearch,Elastic,langchain,人工智能,elasticsearch,搜索引擎,大数据,全文检索

展示结果

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

Search

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

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四),AI,Elasticsearch,Elastic,langchain,人工智能,elasticsearch,搜索引擎,大数据,全文检索

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")

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四),AI,Elasticsearch,Elastic,langchain,人工智能,elasticsearch,搜索引擎,大数据,全文检索

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")

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四),AI,Elasticsearch,Elastic,langchain,人工智能,elasticsearch,搜索引擎,大数据,全文检索

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)

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四),AI,Elasticsearch,Elastic,langchain,人工智能,elasticsearch,搜索引擎,大数据,全文检索

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四),AI,Elasticsearch,Elastic,langchain,人工智能,elasticsearch,搜索引擎,大数据,全文检索

上面的 jupyter notebook 的代码可以在地址 https://github.com/liu-xiao-guo/semantic_search_es/blob/main/RAG-langchain-elasticsearch.ipynb 下载。文章来源地址https://www.toymoban.com/news/detail-755428.html

到了这里,关于Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【论文笔记】Active Retrieval Augmented Generation

    论文题目:Active Retrieval Augmented Generation 论文地址:Active Retrieval Augmented Generation - ACL Anthology 会议:EMNLP 2023 main (Proceedings of the 2023 Conference on Empirical Methods in Natural Language Processing) github 链接:jzbjyb/FLARE: Forward-Looking Active REtrieval-augmented generation (FLARE) (github.com) 笔记参考:

    2024年03月20日
    浏览(45)
  • Retrieval-Augmented Multimodal Language Modeling

    本文是LLM系列文章,针对《Retrieval-Augmented Multimodal Language Modeling》的翻译。 最近的多模态模型,如DALL-E和CM3,在文本到图像和图像到文本生成方面取得了显著进展。然而,这些模型将其所有知识(例如,埃菲尔铁塔的外观)存储在模型参数中,需要越来越大的模型和训练数据

    2024年02月12日
    浏览(34)
  • In-Context Retrieval-Augmented Language Models

    本文是LLM系列文章,针对《In-Context Retrieval-Augmented Language Models》的翻译。 检索增强语言建模(RALM)方法在生成过程中对基础语料库中的相关文档设置语言模型(LM),可以显著提高语言建模性能。此外,它们可以缓解事实上不准确的文本生成问题,并提供自然的来源归因机

    2024年02月10日
    浏览(37)
  • 论文阅读:Retrieval-augmented Generation across Heterogeneous Knowledge

    跨异构知识的检索增强生成 NAACL 2022 论文链接 摘要 检索增强生成(RAG)方法越来越受到NLP社区的关注,并在许多NLP下游任务上取得了最先进的性能。与传统的预训练生成模型相比, RAG方法具有知识获取容易、可扩展性强、训练成本低等显著优点 。尽管现有的RAG模型已应用于

    2024年02月06日
    浏览(37)
  • 使用langchain与你自己的数据对话(三):检索(Retrieval)

      之前我已经完成了使用langchain与你自己的数据对话的前两篇博客,还没有阅读这两篇博客的朋友可以先阅读一下: 使用langchain与你自己的数据对话(一):文档加载与切割 使用langchain与你自己的数据对话(二):向量存储与嵌入 今天我们来继续讲解deepleaning.AI的在线课程“Lan

    2024年02月15日
    浏览(35)
  • 【AI大模型应用开发】【LangChain系列】实战案例3:深入LangChain源码,你不知道的WebResearchRetriever与RAG联合之力

    大家好,我是同学小张,日常分享AI知识和实战案例 欢迎 点赞 + 关注 👏, 持续学习 , 持续干货输出 。 +v: jasper_8017 一起交流💬,一起进步💪。 微信公众号也可搜【同学小张】 🙏 本站文章一览: 上篇文章我们学习了如何利用 LangChain 通过 URL 获取网页内容。本文我们继

    2024年04月17日
    浏览(41)
  • Decoupling Knowledge from Memorization: Retrieval-augmented Prompt Learning

    本文是LLM系列的文章,针对《Decoupling Knowledge from Memorization: Retrieval 提示学习方法在仍然遵循基于参数的学习范式的同时,通过诱导更好的小样本表现,在自然语言处理中掀起了波澜;学习中的遗忘和死记硬背问题可能会遇到不稳定的泛化问题。具体来说,在完全监督的训练

    2024年02月11日
    浏览(40)
  • 使用 LangChain 和 Elasticsearch 的隐私优先 AI 搜索

    作者:Dave Erickson 在过去的几个周末里,我一直在 “即时工程” 的迷人世界中度过,并了解像 Elasticsearch® 这样的向量数据库如何通过充当长期记忆和语义知识存储来增强像 ChatGPT 这样的大型语言模型 (LLM)。 然而,让我和许多其他经验丰富的数据架构师感到困扰的一件事是,

    2024年02月08日
    浏览(37)
  • 【论文阅读】REPLUG: Retrieval-Augmented Black-Box Language Models

    原文地址:REPLUG: Retrieval-Augmented Black-Box Language Models 本文提出 REPLUG ,一个将语言模型视为黑盒检索增强的语言模型架构。在 REPLUG 中,仅将检索得到的文档拼接到原有输入前面即可,不需要像以前一样更新语言模型参数。该架构中可以通过更新检索器进一步提升性能。 给一

    2024年02月11日
    浏览(33)
  • 论文阅读---Albert :Few-shot Learning with Retrieval Augmented Language Models

    增强语言模型 Augmented Language Models https://arxiv.org/abs/2208.03299 提前知识: BERT (Bidirectional Encoder Representations from Transformers)是一种预训练语言模型,它通过在大规模文本数据上进行预训练,学习文本的双向表示,并在多种NLP任务中展现出卓越的性能。BERT的双向性意味着它能够

    2024年04月23日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包