使用 OpenAI、LangChain 和 LlamaIndex 构建 Knowledge

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: 使用 OpenAI、LangChain 和 LlamaIndex 构建 Knowledge

image.png

AI 时代的到来,可以做和想象的事情很多,不管是什么类型的场景,宗旨主要是提高效率。构建自己的 DevSecOps 知识库,可以在保障数据安全性和效率。而使用 OpenAI、LangChain 和 LlamaIndex 等技术是可以帮助更好地构建一个强大的知识库,以支持 DevSecOps 实践。借助这些技术可以自动化文本分析、翻译、归类和搜索等任务,从而节省时间和精力。

DevSecOps 对于开发者来说,是日常工作的重要组成部分,喜欢在 DevSecOps 领域学习并通过博客与他人分享知识。通常,发现自己在文章中搜索需要的信息。为 DevSecOps 构建自己的自定义知识库,以便可以将文件或文章提供给它并在需要时进行搜索。

在本文中,将探索使用 OpenAI、LangChain 和 LlamaIndex(GPT 索引)构建自定义 DevSecOps 知识库。

整体架构

首先将文章文件提供给知识库,然后,使用与 DevSecOps 相关文章文件中的问题查询知识库。整理架构分为两个阶段:

数据摄取/索引

image.png

数据查询

image.png

下面就开始构建知识库。

环境准备

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。

添加数据源

测试数据源这里就使用之前发布过的三篇博客。

image.png

编写 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/

image.png

输入一下简单的问题:

问:AI机器人使用什么技术


回答:AI机器人使用的技术包括arXiv API、LLMChain和Langchain代理。

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

问:AI 助理可以用来做什么?使用什么技术架构?


回答:根据上述上下文信息,AI助理可以用来进行多种任务,包括生成论文摘要和故事机。技术架构方面,论文摘要的AI助理使用了arXiv API、LLMChain和Langchain代理进行信息检索、摘要生成和发布过程。而故事机的AI助理则利用了Streamlit和Hugging Face开源语言模型。

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 力量的应用程序中的潜力是无限的!


相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
30天前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
229 2
|
15天前
|
JSON 数据可视化 NoSQL
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
本文介绍了LangChain的LLM Graph Transformer框架,探讨了文本到图谱转换的双模式实现机制。基于工具的模式利用结构化输出和函数调用,简化了提示工程并支持属性提取;基于提示的模式则为不支持工具调用的模型提供了备选方案。通过精确定义图谱模式(包括节点类型、关系类型及其约束),显著提升了提取结果的一致性和可靠性。LLM Graph Transformer为非结构化数据的结构化表示提供了可靠的技术方案,支持RAG应用和复杂查询处理。
60 2
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
|
1月前
|
人工智能 API
LangChain-14 Moderation OpenAI提供的功能:检测内容中是否有违反条例的内容
LangChain-14 Moderation OpenAI提供的功能:检测内容中是否有违反条例的内容
38 2
|
2月前
|
人工智能 自然语言处理 API
深入浅出 LangChain 与智能 Agent:构建下一代 AI 助手
我们小时候都玩过乐高积木。通过堆砌各种颜色和形状的积木,我们可以构建出城堡、飞机、甚至整个城市。现在,想象一下如果有一个数字世界的乐高,我们可以用这样的“积木”来构建智能程序,这些程序能够阅读、理解和撰写文本,甚至与我们对话。这就是大型语言模型(LLM)能够做到的,比如 GPT-4,它就像是一套庞大的乐高积木套装,等待我们来发掘和搭建。
103 1
|
3月前
|
Python
Langchain使用OpenAI报错AttributeError: module ‘openai‘ has no attribute ‘error 的解决方案
这篇文章描述了作者在使用Python的`openai`和`langchain`库时遇到的错误,错误的提示是`AttributeError: module 'openai' has no attribute 'error'`。文章通过分析环境和版本信息,发现问题出在`langchain`库的版本过旧。作者通过卸载旧版本并安装指定版本的`langchain`库解决了问题,并总结了在遇到此类问题时检查和更新依赖库的重要性。
358 1
|
3月前
|
机器学习/深度学习 自然语言处理 算法
LangChain 构建问题之智能体协同中的决策机制的实现如何解决
LangChain 构建问题之智能体协同中的决策机制的实现如何解决
41 1
|
3月前
|
自然语言处理
LangChain 构建问题之实例化一个聊天模型如何解决
LangChain 构建问题之实例化一个聊天模型如何解决
29 1
|
3月前
|
人工智能 自然语言处理 前端开发
LangChain 构建问题之MetaGPT 和 ChatDev 的支持功能差异如何解决
LangChain 构建问题之MetaGPT 和 ChatDev 的支持功能差异如何解决
62 0
|
3月前
|
数据可视化 Unix Linux
LangChain 构建问题之可视化智能代理对游戏的生成过程如何解决
LangChain 构建问题之可视化智能代理对游戏的生成过程如何解决
26 0
|
3月前
|
开发框架 Unix Linux
LangChain 构建问题之在Unix/Linux系统上设置OpenAI API密钥如何解决
LangChain 构建问题之在Unix/Linux系统上设置OpenAI API密钥如何解决
49 0