为了账号安全,请及时绑定邮箱和手机立即绑定

使用LangChain和SingleStore实现RAG的分步指南:检索增强生成

图片由SingleStore团队成员创作

今天,大型语言模型(LLM)已成为现代AI/ML应用中重要的构建模块之一。当AI还被认为更像是虚构而非现实的时代已经过去。每个组织都在拥抱这些LLM的力量来构建他们定制化应用。这些LLM带来的好处是巨大的,因此,对这类应用的需求也明显增加。

诸如 Google、Meta、OpenAI、Anthropic 等公司极大地促进了生成式人工智能的发展。但要构建大规模语言模型驱动的应用程序,仅靠大规模语言模型是不够的,还需要相应的工具、框架和方法来确保应用程序既稳健又符合预期。

本文将讨论一个名为检索增强生成(RAG)的框架,以及一些工具和一个名为LangChain的框架。

检索增强生成?

大型语言模型确实很棒,但它们也有诸如生成虚假、有偏见、编造的不准确回答的限制,这些不准确的回答被称为大型语言模型(LLM)的幻觉。这些由LLM生成的回答会损害应用程序的真实性和信誉。为了减少这些不良回复,人们已经采用了一些技术。其中一种方法是检索增强生成(RAG)技术。

SingleStore 图片

RAG 是一种通过引入外部知识库来增强 LLM 应用的方法,以减少幻觉的影响。这样一来,对于任何用户查询,系统都会在知识库中搜索相关信息,并获取最准确的信息。有了自定义的知识来源,系统就不会产生幻觉了。

如上图所示,PDF是我们存储在向量数据库中的外部知识库,以向量嵌入(向量数据)的形式存储。基本上,PDF文档会被拆分成小段文本,这些文本会被赋予一组数字,这些数字被称为向量嵌入。你需要一个嵌入模型来将文本、图像、音频和视频转换为嵌入。

用户的查询通过相同的LLM转换为嵌入,然后通过向量数据库找到最相关的文档。一旦找到相关文档,它会通过LLM添加更多上下文,最后生成响应。这样,RAG已成为大多数基于LLM的应用程序检索最准确或最相关的响应的基石。当然,有一些值得注意的AI框架,如LangChain和LlamaIndex,它们通过提供所需的所有工具包来帮助这些LLM应用程序更加稳健。让我们来了解LangChain,因为我们将在教程中使用LangChain。

什么是LangChain呢?

LangChain 是由 Harrison Chase 开发的开源 AI 框架,旨在帮助开发人员通过提供所有必需的组件来创建强大的 AI 应用程序。LangChain 配备了内存能力,与向量数据库的集成能力,连接外部数据源的工具和方法,逻辑功能和 API。这使得 LangChain 成为构建基于 LLM 的应用程序的强大框架。

图片来源:Upstash

LangChain 包含了诸如模型输入输出、检索、链和代理等模块,每个模块都有其独特的优势,帮助开发者构建无缝的人工智能应用程序。模型输入输出模块处理提示、LLM 交互、聊天模型和输出解析器。检索模块处理与数据管理相关的所有内容,从加载、修改、文本分割到使用嵌入模型嵌入数据。接下来是链模块(Chain 模块),顾名思义,它将所有任务相互连接,确保任务按顺序执行。代理作为系统的“大脑”,负责决策制定。它们确定完成任务所需的行动顺序,选择合适的工具。代理能够选择完成任务所需的工具。LangChain 提供了多个代理工具包库,可用于构建强大的基于 LLM 的应用程序。

您可以使用以下pip命令来安装LangChain

使用pip安装langchain库
什么是SingleStore?

SingleStore 是一个现代的基于云的关系型和分布式数据库管理系统,它专门用于高性能、实时数据处理。SingleStore 不仅适用于 OLAP(联机分析处理)和 OLTP(联机事务处理)工作负载,还可以无缝地构建实时 GenAI(生成式AI)应用程序。

SingleStore 自身从 2017 年就开始支持(向量搜索和存储)[1]。它与当今流行的 AI 框架(如 LangchainLlamaIndex 等)具有令人惊叹的集成。它支持 SQL 和 Python,以及所有数据类型,这使得它成为任何组织可以拥有的唯一数据库,而无需为不同类型的工作负载分别使用不同的数据库。

检索增强生成与LangChain和SingleStore:实战教程

让我们来构建一个简单的AI应用程序,可以从我们自己的自定义数据中获取任何给定用户查询的上下文相关的相关信息。

注册SingleStore数据库将其用作我们的向量数据库的工具

一旦您注册了,您需要创建一个工作空间。这既简单又免费,所以赶快去做吧。

一旦您创建了工作区,就可以使用您希望的任何名称来创建一个数据库。

如上截图所示,你可以通过右侧的创建数据库选项卡创建数据库。

现在,让我们去“Develop”部分使用我们的Notebooks(就像Jupyter Notebooks)功能。

创建一个新的笔记本(电子),并将其命名为你希望的名字。

在做任何事情之前,请从笔记本页面上的下拉菜单中选择您的工作空间和数据库。

现在,开始将下面所示的代码片段添加到你刚刚创建的笔记本里,如下。

安装所需的库和依赖项

    !pip install langchain --quiet  # 安装langchain库  
    !pip install --upgrade openai==0.28.1 --quiet  # 升级openai库到0.28.1版本  
    !pip install pdf2image --quiet  # 安装pdf2image库  
    !pip install pdfminer.six --quiet  # 安装pdfminer.six库  
    !pip install singlestoredb --quiet  # 安装singlestoredb库  
    !pip install tiktoken --quiet  # 安装tiktoken库  
    !pip install --upgrade unstructured==0.10.14 --quiet  # 升级unstructured库到0.10.14版本

导入所需的库

    从langchain.document_loaders导入PyPDFLoader  
    从langchain.chat_models导入ChatOpenAI  
    从langchain.embeddings.openai导入OpenAIEmbeddings  
    从langchain.text_splitter导入RecursiveCharacterTextSplitter  
    从langchain.chains导入RetrievalQA, ConversationalRetrievalChain  
    导入os

加载您的自定义文档

从langchain.document_loaders导入OnlinePDFLoader  
loader = OnlinePDFLoader("example.pdf")  
data = loader.load()

我正在使用这个公开可用的[关于全球旅游晴雨表的pdf]。

请在example.pdf的位置输入完整的URL,如果您喜欢使用相同的文件。

使用LangChain框架将文档拆分成片段

     from langchain.text_splitter import RecursiveCharacterTextSplitter  

    print(f"您有{len(data)}个文档")  
    print(f"您的第一个文档包含{len(data[0].page_content)}个字符")  

    text_splitter = RecursiveCharacterTextSplitter(chunk_size = 2000, chunk_overlap = 0)  
    texts = text_splitter.split_documents(data)  

    print(f"您现在有{len(texts)}个片段")

利用 OpenAI API 生成文档片段的嵌入

    import os  
    import getpass  
    # 获取OpenAI API密钥  
    os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key: ")

当你运行上述命令时,它会提示你输入你的OpenAI API密钥。

让我们将文档片段数据存储于SingleStore数据库表中

请务必确保您已选择要存储数据的工作空间和位置。

    从langchain.embeddings导入OpenAIEmbeddings()  

    embedding = OpenAIEmbeddings()  

    #从langchain.vectorstores导入SingleStoreDB  
    从langchain.vectorstores导入SingleStoreDB()  
    #从langchain.vectorstores.utils导入DistanceStrategy  

    #s2.ORDERING_DIRECTIVE['DOT_PRODUCT'] = s2.ORDERING_DIRECTIVE[DistanceStrategy.DOT_PRODUCT]  

    docsearch = SingleStoreDB.from_documents(  
        texts,  
        embedding,  
        table_name = "tourism_pdf",  
        #distance_strategy = "DOT_PRODUCT"  
    )

您可以根据需要更改表名。

让我们检查存储于我们数据库中的文本片段及其相关嵌入。

     选择* from tour_pdf LIMIT 1;

使用相似度搜索仅针对您自定义数据(您加载的PDF)提出查询,以检索最接近的 top k 项。

     query = "全球通胀预计在2023年会下降还是上升?"  
    docs = docsearch.similarity_search(query)  
    print(docs[0].page_content)

你应看到的答案是一个较长的段落回答,该回答不够准确且效率较低。

这里是增强的查询响应

     import openai  

    prompt = f"用户提问:{query}。文档中与之最相似的文本是:{docs[0].page_content}"  

    response = openai.ChatCompletion.create(  
        model="gpt-3.5-turbo",  
        messages=[  
            {"role": "system", "content": "你是一个乐于助人的助手,随时准备帮助用户。"},  
            {"role": "user", "content": prompt}  
        ]  
    )  
    print(response['choices'][0]['message']['content'])

你收到的回复将会既简洁明了又高效,并包含更多背景信息。

让我们来测试在没有提供知识库(例如PDF等自定义文档)的情况下会怎样

    from langchain.llms import OpenAI  
    llm = OpenAI(temperature=0.8)  

    llm.predict("你的查询")

在这种情况下,它将不会提供信息,并可能会说没有足够的数据来回答您的问题/查询。这样,检索增强生成方法同时减轻了LLM的幻觉效应,从而提高效率。

最后,用户可以去他们的数据库验证提供的pdf是否已分块存储。你应该看到如下数据,

希望你已经理解了我们是如何将RAG方法与LangChain框架和SingleStore结合使用来高效地存储和检索数据的。如果你想尝试上述指南,你需要一个免费的SingleStore账户、OpenAI API密钥和一个公开可用的PDF文件。

**SingleStore 正在为每个新注册用户提供价值 600 美元的免费信用**.

然后尽快试试那个教程

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消