使用 OpenAI、LangChain 和 LlamaIndex 构建 Knowledge

AI 年代的到来,能够做和想象的作业许多,不管是什么类型的场景,宗旨主要是提高功率。构建自己的 DevSecOps 常识库,能够在保证数据安全性和功率。而运用 OpenAI、LangChain 和 LlamaIndex 等技能是能够协助更好地构建一个强大的常识库,以支撑 DevSecOps 实践。借助这些技能能够自动化文本剖析、翻译、归类和搜索等使命,从而节省时间和精力。

DevSecOps 关于开发者来说,是日常作业的重要组成部分,喜欢在 DevSecOps 范畴学习并经过博客与别人同享常识。一般,发现自己在文章中搜索需求的信息。为 DevSecOps 构建自己的自界说常识库,以便能够将文件或文章供给给它并在需求时进行搜索。

在本文中,将探索运用 OpenAI、LangChain 和 LlamaIndex(GPT 索引)构建自界说 DevSecOps 常识库。

  • 文章触及的内容在Github仓库:github.com/QuintionTan…

全体架构

首先将文章文件供给给常识库,然后,运用与 DevSecOps 相关文章文件中的问题查询常识库。收拾架构分为两个阶段:

数据吸取/索引

使用 OpenAI、LangChain 和 LlamaIndex 构建 Knowledge

数据查询

使用 OpenAI、LangChain 和 LlamaIndex 构建 Knowledge

下面就开始构建常识库。

环境预备

Python 装置:这是 AI 应用开发必备的环境之一,环境的装备就不做介绍了。假如没有,请参考 Python 下载页面下载装置 Python。确保经过运转以下指令将 pip 升级到最新版别:

python -m pip install -U pip

OpenAI API 密钥:翻开 OpenAI 的官网的 API 密钥页面生成一个新的 API 密钥(假如还没有)。主张经过运用约束页面设置运用约束相关信息以便更好的控制支出。

创立项目目录,命名为 AI-DevSecOps,翻开终端,在项目目录下执行指令创立一个虚拟环境:

python -m venv venv

接下来执行以下指令使其环境收效:

source venv/bin/activate

为了训练自界说 DevSecOps 常识库,需求装置一些依赖库,运转指令:

pip install openai langchain llama_index==0.6.12 pypdf PyCryptodome gradio

注意:指令中为 llama_index 指定了 0.6.12 版别。在不指定版别的情况下,它将装置最新版别 0.7.22

简略介绍一下装置的依赖库。

openai

运用 OpenAI 库有两个意图:

  • 数据吸取/索引:如上面的架构图所示,将在底层经过 LangChain 调用 OpenAI 的嵌入模型 text-embedding-ada-002
  • 数据查询:调用 OpenAI 的 GPT-3.5 LLM(大言语模型)。 GPT-3.5 模型能够了解并生成自然言语或代码。GPT-3.5 的模型 gpt-3.5-turbo 是最强大和最具本钱效益的模型。

langchain

LangChain 是一个开源库,为开发人员供给必要的东西来创立由 LLM 供给支撑的应用程序。它是一个环绕 LLM 构建的结构,可用于谈天机器人、生成式问答 (GQA)、摘要等。LangChain 的中心思维是开发人员能够将不同的组件像 相同串在一起,以环绕 LLM 创立更高档的示例。

LangChain 供给了一系列模块,这些模块是作为任何 LLM 支撑的应用程序构建块的中心抽象。这些模块包括模型、提示、内存、索引、链、署理和回调。关于常识库谈天机器人,将运用 LangChain 的 chat_models 模块。

llama_index

LlamaIndex 运用 LangChain 的 LLM 模块并答应自界说底层 LLM。LlamaIndex 是一个强大的东西,供给了一个中心接口来将 LLM 与外部数据连接起来,并答应依据供给的数据创立一个谈天机器人。运用 LlamaIndex,无需成为 NLP 或机器学习专家,只需求供给期望谈天机器人运用的数据,LlamaIndex 会处理剩下的作业。正如 LlamaIndex 的创立者 Jerry Liu 所述,LlamaIndex 以易于运用的方法供给以下东西:

  • 供给数据连接器以获取现有的数据源和数据格式(API、PDF、文档、SQL 等)
  • 供给构建数据(索引、图表)的方法,以便这些数据能够轻松地与 LLM 一起运用。
  • 为数据供给高档检索/查询界面:输入任何 LLM 输入提示,取回检索到的上下文和常识增强输出。
  • 答应与外部应用程序结构(例如:LangChain、Flask、Docker、ChatGPT 或其他任何东西)轻松集成。

pypdf+PyCryptodome

pypdf 是一个免费开源的纯 python PDF 库,能够拆分、合并、裁剪和转化 PDF 文件的页面。本文将运用这个库来解析 PDF 文件。 PyCryptodome 是另一个有助于在解析 PDF 文件时避免过错的库。

gradio

Gradio 是一个开源 Python 包,能够经过几行代码为 ML 模型、任何 API 乃至任意 Python 函数快速创立易于运用、可自界说的 UI 组件。能够将 Gradio GUI 直接集成到 Jupyter Notebook 中,或将其作为链接与任何人同享。本文将运用 Gradio 为常识库构建一个简略的 UI。

添加数据源

测验数据源这儿就运用之前发布过的三篇博客。

  • 《利用Streamlit 和 Hugging Face 创立免费AI故事机》
  • 《经过 OpenAI 和 Langchain 构建 Arxiv 论文摘要 Twitter 机器人》
  • 《把握AI摘要技能构建学习助理》

使用 OpenAI、LangChain 和 LlamaIndex 构建 Knowledge

编写 Python 代码

网上有许多用于构建自界说谈天机器人的开源 Python 教程,有些包括过时的代码,是在旧版别的库上构建的,很难让它们按预期的方法运转。主张依照LlamaIndex Usage Pattern 上的阐明作为根本结构,然后添加自己的逻辑。

第 1 步:导入模块和类

from llama_index import StorageContext, ServiceContext, GPTVectorStoreIndex, LLMPredictor, PromptHelper, SimpleDirectoryReader, load_index_from_storage
from langchain.chat_models import ChatOpenAI
import gradio as gr
import sys
import os
  • SimpleDirectoryReaderLLMPredictorPromptHelperStorageContextServiceContextGPTVectorStoreIndexload_index_from_storage 都是来自 llama_index 模块的类。
  • ChatOpenAIlangchain.chat_models 模块中的一个类。
  • gradio 是用来创立WEB界面的库。
  • sysos 是用于体系相关操作的标准 Python 模块。

第 2 步:运用 os.environ["OPENAI_API_KEY"] 将 OpenAI 的 API 密钥设置为环境变量。需求将 YOUR-OPENAI-API-KEY 替换为实践 OpenAI API 密钥才能正常作业。

os.environ["OPENAI_API_KEY"] = 'YOUR-OPENAI-API-KEY'

第 3 步:界说函数 data_ingestion_indexing(directory_path),这个函数负责提取数据,并在常识库中创立和保存用于数据查询的索引。

def create_service_context():
    # 参数装备
    max_input_size = 4096
    num_outputs = 512
    max_chunk_overlap = 20
    chunk_size_limit = 600
    # 答应用户显式设置某些参数装备
    prompt_helper = PromptHelper(
        max_input_size, num_outputs, max_chunk_overlap, chunk_size_limit=chunk_size_limit)
    # LLMPredictor 是 LangChain 的 LLMChain 的包装类,能够轻松集成到 LlamaIndex 中
    llm_predictor = LLMPredictor(llm=ChatOpenAI(
        temperature=0.5, model_name="gpt-3.5-turbo", max_tokens=num_outputs))
    # 结构 service_context
    service_context = ServiceContext.from_defaults(
        llm_predictor=llm_predictor, prompt_helper=prompt_helper)
    return service_context
def data_ingestion_indexing(directory_path):
    # 从指定目录路径加载数据
    documents = SimpleDirectoryReader(directory_path).load_data()
    # 第一次树立索引时
    index = GPTVectorStoreIndex.from_documents(
        documents, service_context=create_service_context()
    )
    # 耐久化索引到磁盘,默许 storage 文件夹
    index.storage_context.persist()
    return index

下面就来简略解释一下代码:

  • 界说了一个名为 create_service_context 的函数,创立 ServiceContext,一个用于 LlamaIndex 索引和查询类的实用容器。该容器包括一般用于装备每个索引和查询的目标,如 LLMPredictor(用于装备 LLM,它是 LangChain 的 LLMChain 的包装类,能够轻松集成到 LlamaIndex 中),PromptHelper(答应用户显式设置某些约束参数,例如最大输入巨细、生成的输出标记数、最大块重叠等)、BaseEmbedding(用于装备嵌入模型)等。
  • 运用 SimpleDirectoryReader 从指定的目录路径加载数据。
  • 它运用加载的文档创立 GPTVectorStoreIndex 实例,并经过调用函数 create_service_context() 创立 service_context
  • 最终,调用 storage_context 并将索引耐久化到默许存储文件夹下的磁盘,并回来索引目标。

第 4 步:界说函数 data_querying(input_text),这个函数是常识库逻辑的中心。

def data_querying(input_text):
    # 重建存储上下文
    storage_context = StorageContext.from_defaults(persist_dir="./storage")
    # 从存储加载索引
    index = load_index_from_storage(
        storage_context, service_context=create_service_context())
    # 用输入文本查询索引
    response = index.as_query_engine().query(input_text)
    return response.response
  • 重建存储上下文
  • 从存储中加载索引。由于运用自界说的 ServiceContext 目标初始化了索引,因而还需求在 load_index_from_storage 期间传入相同的 ServiceContext
  • 运用 index.as_query_engine().query() 运用输入文本查询索引。
  • 回来从索引收到的呼应。

第 5 步:经过创立 gr.Interface 实例来界说 UI。

iface = gr.Interface(fn=data_querying,
                     inputs=gr.components.Textbox(
                         lines=7, label="Enter your text"),
                     outputs="text",
                     title="DevPoint's Knowledge Base")
  • fn 参数设置为前面界说的 data_querying 函数。
  • inputs 参数指定一个文本框输入组件,有 7 行用于输入文本。
  • outputs 参数指定输出将基于文本。
  • title 参数设置网页界面的标题。

第 6 步:运用参数数据调用 data_ingestion_indexing 函数以创立和保存索引。请注意,此数据目录是存储 PDF 文档的当地。假如想以不同的方法命名目录,能够在此处相应地进行更改。

#passes in data directory
index = data_ingestion_indexing("data")

第 7 步:iface.launch(share=False) 发动 UI,使谈天机器人能够经过WEB浏览器访问。

能够挑选将 share 设置为 True,这答应 Gradio 创立同享链接,以便能够与别人同享常识库谈天机器人。

发动 DevSecOps 常识库

现在现已预备好自界说 PDF 文件和代码,翻开终端,在 AI-DevSecOps 目录中运转以下指令来发动 DevSecOps 常识库:

python bot.py

发动新常识库的用户界面:http://127.0.0.1:7860/

使用 OpenAI、LangChain 和 LlamaIndex 构建 Knowledge

输入一下简略的问题:

问:AI机器人运用什么技能

答复:AI机器人运用的技能包括arXiv API、LLMChain和Langchain署理。

在 PDF 的内容中,有一遍博客用到了 arXiv API

问:AI 助理能够用来做什么?运用什么技能架构?

答复:依据上述上下文信息,AI助理能够用来进行多种使命,包括生成论文摘要和故事机。技能架构方面,论文摘要的AI助理运用了arXiv API、LLMChain和Langchain署理进行信息检索、摘要生成和发布进程。而故事机的AI助理则利用了Streamlit和Hugging Face开源言语模型。
  • 文章触及的内容在Github仓库:github.com/QuintionTan…

AI 机器人会把隐私数据暴露给 OpenAI 吗?

答案是否定的。依据 API 上的 OpenAI 隐私政策:

OpenAI 不会运用客户经过 API 提交的数据来训练 OpenAI 模型或改善 OpenAI 的服务产品。

两个函数,用于数据吸取/索引的 data_ingestion_indexing 和用于问答的 data_querying,都经过 LangChain 调用 OpenAI API,因而能够放心,OpenAI 不会依据上述 API 的隐私政策运用私家数据。

关于本钱

可能现已知道,运用 OpenAI 模型确实会发生费用。在用例中,在数据吸取/索引期间运用它的嵌入模型,并在数据查询中运用谈天模型。以下是定价详情:

  • 关于嵌入模型 text-embedding-ada-002$0.0004 / 1K Token
  • 关于谈天模型 gpt-3.5-turbo$0.002 / 1K Token

假如计划运用 OpenAI LLM,强烈主张在 OpenAI 的运用约束页面上装备运用约束,能够在其间界说硬约束和软约束,以便妥善办理运用情况。

总结

本文讨论了怎么构建定制的 DevSecOps 常识库谈天机器人。这仅仅是一个概念证明。将 LlamaIndex 和 LangChain 结合到构建经过私家数据利用 LLM 力量的应用程序中的潜力是无限的!