使用 OpenAI、LangChain 和 LlamaIndex 构建自己的 DevSecOps 知识库
00 分钟
2023-6-3
2023-8-26
type
status
slug
summary
date
tags
category
password
Text
AI summary
AI custom autofill
Multi-select
Status
URL
hashtag
勘误
标签
标题
类型
贴文
🪄
icon
 
在本文中,将介绍如何使用 OpenAI、LangChain 和 LlamaIndex(GPT 索引)构建自定义 DevSecOps 知识库。我们将探索构建自定义 DevSecOps 知识库的高级架构,以及如何使用这些库。让我们深入研究代码,一步一步地实现我们的目标。

 

构建您的自定义知识库聊天机器人

DevSecOps 是我目前工作中日常工作的重要组成部分。我喜欢在 DevSecOps 领域学习并通过博客与他人分享我的知识。通常,我发现自己在我的文章中搜索我需要的信息。为 DevSecOps 构建我自己的自定义知识库这样我可以将我的文件或文章提供给它并在需要时搜索它不是很好吗?
在本文中,让我们探索使用 OpenAI、LangChain 和 LlamaIndex(GPT 索引)构建自定义 DevSecOps 知识库。

高级架构

我们将首先将我的文章文件提供给我们的知识库。然后,我们使用与 DevSecOps 相关的文章文件中的问题查询我们的知识库。
让我们将架构分为两个阶段:数据摄取/索引和数据查询。
notion image
notion image
现在,让我们开始构建我们的知识库。

先决条件

  • Python 安装:假设您在本地环境中安装了 Python。如果没有,请参考Python下载
    • 页面下载安装Python。请确保通过运行以下命令将 pip 升级到最新版本:
  • 在您的本地环境中创建一个目录,例如DevSecOpsKB. 您将在此目录中运行以下所有命令。

安装库

为了训练我们的自定义 DevSecOps 知识库,我们需要安装一些库。只需导航到DevSecOpsKB目录,然后运行:
注意:我们0.6.12llama_index在不指定版本的情况下,它将安装最新版本,0.6.16截至此更新(2023 年 5 月 31 日),它引入了重大更改。llama_index我们在另一个博客中介绍了最新版本中的一些更改
让我们仔细看看每个库。

OpenAI 库

我们使用OpenAI库有两个目的:
  • 数据摄取/索引:如上图所示,我们将text-embedding-ada-002在后台通过 LangChain 调用 OpenAI 的嵌入模型。
  • 数据查询:我们会调用OpenAI的GPT-3.5 LLM(Large Language Model)。GPT-3.5 模型可以理解并生成自然语言或代码。我们将在 GPT-3.5 系列中使用他们最强大和最具成本效益的模型,gpt-3.5-turbo.

LangChain

LangChain是一个开源库,为开发人员提供必要的工具来创建由 LLM 提供支持的应用程序。它是一个围绕 LLM 构建的框架,可用于聊天机器人、生成式问答 (GQA)、摘要等。该库的核心思想是开发人员可以将不同的组件“链接”在一起,以围绕 LLM 创建更高级的用例。
LangChain 提供了一系列模块,这些模块是作为任何 LLM 支持的应用程序构建块的核心抽象。这些模块包括模型、提示、内存、索引、链、代理和回调。对于我们的知识库聊天机器人,我们将使用 LangChain 的chat_models模块。

LlamaIndex

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。

如何添加数据源

我将我在DevOps 自助服务之路:五部分系列中列出的文章以及GitHub Actions 工作流的故障排除提示转换为 PDF 并将这些 PDF 文档保存在我的DevSecOpsKB/data目录下。让我们使用这些文档开始训练我们的知识库聊天机器人。
notion image

实施 Python 代码

网上有许多用于构建自定义聊天机器人的开源 Python 教程,但许多包含过时的代码,因为它们是在旧版本的库上构建的,很难让它们按预期工作。我建议按照LlamaIndex Usage Pattern页面上的说明作为基本框架,然后添加您的自定义逻辑。让我们深入研究代码。
第 1 步:导入以下模块和类:
SimpleDirectoryReaderLLMPredictorPromptHelperStorageContextServiceContextGPTVectorStoreIndex, 和load_index_from_storage 是模块中的类llama_index
ChatOpenAIlangchain.chat_models模块中的一个类。
gradio是我们用来创建网络界面的库。
sys并且os是用于系统相关操作的标准 Python 模块。
第 2 步:将 OpenAI 的 API 密钥设置为环境变量,使用os.environ["OPENAI_API_KEY"]您需要'YOUR-OPENAI-API-KEY'用实际的 OpenAI API 密钥替换它才能工作。
第 3 步:定义函数data_ingestion_indexing(directory_path)该功能负责摄取数据,并在我们的知识库中创建和保存用于数据查询的索引。
  • 我们定义了一个名为 的实用函数create_service_context,它ServiceContext为 LlamaIndex 索引和查询类创建了一个实用容器。该容器包含通常用于配置每个索引和查询的对象,例如LLMPredictor(用于配置 LLM,它是 LangChain 的 LLMChain 的包装类,可以轻松集成到 LlamaIndex),(PromptHelper允许用户明确设置某些约束参数,例如最大输入大小、生成的输出标记数、最大块重叠等)BaseEmbedding(用于配置嵌入模型)等。
  • 它用于SimpleDirectoryReader从指定的目录路径加载数据。
  • 它通过调用实用程序函数创建了一个GPTVectorStoreIndex 加载的实例。documentsservice_contextcreate_service_context()
  • 最后,它调用storage_context并将索引保存到默认文件夹下的磁盘storage,并返回index对象。
第 4 步:定义函数data_querying(input_text)这个功能是我们知识库逻辑的核心。
  • 它重建存储上下文。
  • 它从存储中加载索引。由于我们使用自定义对象初始化了索引ServiceContext,因此我们还需要ServiceContext load_index_from_storage.
  • 它使用输入文本查询索引index.as_query_engine().query()
  • 它返回从索引收到的响应。
第 5 步:通过创建 的实例来定义 UI gr.Interface
  • fndata_querying参数设置为之前定义的函数。
  • inputs参数指定一个文本框输入组件,有 7 行用于输入文本。
  • outputs参数指定输出将基于文本。
  • title参数设置网页界面的标题。将其自定义为您想要的 UI 标题。
第 6 步data_ingestion_indexing使用参数调用该函数data以创建和保存索引。请注意,此data目录是我们存储 PDF 文档的地方。如果您想以不同的方式命名您的目录,请在此处相应地进行更改。
第 7 步:该iface.launch(share=False)行启动 UI,使聊天机器人可以通过 Web 浏览器访问。您可以选择转向shareTrue这允许 Gradio 创建共享链接,以便您可以与他人共享您的知识库聊天机器人。对于此 POC,出于简单原因,我们将禁用此功能。
请参阅下面的完整代码。将此代码复制到一个名为 的文件中kb.py,并将其放在我们DevSecOpsKB目录的根目录中。

启动 DevSecOps 知识库

现在我们已经准备好自定义 PDF 文件和代码,让我们通过在目录中运行以下命令来启动我们的 DevSecOps 知识库DevSecOpsKB
让我们启动新知识库的用户界面:http://127.0.0.1:7860/
开始了!我们的新知识库已准备好供我们使用。让我们问一个关于我在一篇关于 DevOps 自助服务模型的文章中创造的术语的一般性问题,特别是 3-2-1 规则,我很高兴看到我们的新知识库输出正确的信息我是寻找:
notion image
询问它在 GitHub Actions 工作流程中遇到的特定错误,我们得到了想要的答案。请参阅以下内容:
notion image
现在,让我们问问我们的知识库是否可以回答有关Harden Runner的问题:
notion image
马上!我对答案的准确程度感到惊讶。接下来看看我们的知识库能不能输出一段代码:
notion image
这个就像一个魅力!
现在,让我们尝试一个消极的场景:让我们尝试提出一个不在提供的源文档中的问题:
notion image
做得好!LlamaIndex 似乎有一个防止幻觉的护栏,这是人工智能的自信反应,但它的训练数据似乎并不合理,因为它不充分、有偏见或过于专业。

这个人工智能机器人会把我的私人数据暴露给 OpenAI 吗?

OpenAI 不会使用客户通过我们的 API 提交的数据来训练 OpenAI 模型或改进 OpenAI 的服务产品。
data_ingestion_indexing我们的数据摄取/索引和data_querying问答功能都通过 LangChain 调用 OpenAI API,因此我们可以放心,OpenAI 不会根据上述 API 隐私政策使用我们的私人数据来训练他们的模型
但是,根据您所在的行业,银行和医疗保健等具有严格数据隐私惯例的行业,您将不得不采取预防措施。最终,由您(和您的团队)决定是否要与 OpenAI 共享您的私人数据。

成本注意事项

您可能已经知道,使用 OpenAI 模型确实会产生费用。在我们的用例中,我们在数据摄取/索引期间使用它的嵌入模型,并在数据查询中使用聊天模型。以下是定价详情:
  • 对于嵌入模型text-embedding-ada-002:$0.0004 / 1K 代币
  • 对于聊天模型gpt-3.5-turbo:$0.002 / 1K 代币这是我在这个聊天机器人上工作时使用 OpenAI 的截图:
notion image
如果您计划使用 OpenAI LLM,我强烈建议您在 OpenAI 的使用限制页面上配置使用限制,您可以在其中定义硬限制和软限制,以便正确管理您的使用。

概括

本文探讨了如何构建定制的 DevSecOps 知识库聊天机器人。这仅仅是一个概念证明。将 LlamaIndex 和 LangChain 结合到构建通过私人数据利用 LLM 力量的应用程序中的潜力是无限的

参考

 
 

作者:Wenqi Glantz

评论