使用 OpenAI、LangChain 和 LlamaIndex 构建 Knowledge

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


相关实践学习
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
5月前
|
人工智能 缓存 监控
使用LangChain4j构建Java AI智能体:让大模型学会使用工具
AI智能体是大模型技术的重要演进方向,它使模型能够主动使用工具、与环境交互,以完成复杂任务。本文详细介绍如何在Java应用中,借助LangChain4j框架构建一个具备工具使用能力的AI智能体。我们将创建一个能够进行数学计算和实时信息查询的智能体,涵盖工具定义、智能体组装、记忆管理以及Spring Boot集成等关键步骤,并展示如何通过简单的对话界面与智能体交互。
1781 1
|
5月前
|
人工智能 Java API
构建基于Java的AI智能体:使用LangChain4j与Spring AI实现RAG应用
当大模型需要处理私有、实时的数据时,检索增强生成(RAG)技术成为了核心解决方案。本文深入探讨如何在Java生态中构建具备RAG能力的AI智能体。我们将介绍新兴的Spring AI项目与成熟的LangChain4j框架,详细演示如何从零开始构建一个能够查询私有知识库的智能问答系统。内容涵盖文档加载与分块、向量数据库集成、语义检索以及与大模型的最终合成,并提供完整的代码实现,为Java开发者开启构建复杂AI智能体的大门。
2736 58
存储 人工智能 机器人
173 0
|
5月前
|
人工智能 安全 数据库
构建可扩展的 AI 应用:LangChain 与 MCP 服务的集成模式
本文以LangChain和文件系统服务器为例,详细介绍了MCP的配置、工具创建及调用流程,展现了其“即插即用”的模块化优势,为构建复杂AI应用提供了强大支持。
|
6月前
|
机器学习/深度学习 算法 大数据
构建数据中台,为什么“湖仓一体”成了大厂标配?
在大数据时代,数据湖与数据仓库各具优势,但单一架构难以应对复杂业务需求。湖仓一体通过融合数据湖的灵活性与数据仓的规范性,实现数据分层治理、统一调度,既能承载海量多源数据,又能支撑高效分析决策,成为企业构建数据中台、推动智能化转型的关键路径。
|
7月前
|
数据采集 存储 分布式计算
一文读懂数据中台架构,高效构建企业数据价值
在数字化时代,企业面临数据分散、难以统一管理的问题。数据中台架构通过整合、清洗和管理数据,打破信息孤岛,提升决策效率。本文详解其核心组成、搭建步骤及常见挑战,助力企业高效用数。
2242 24
|
9月前
|
SQL 机器学习/深度学习 监控
构建数据中枢:数据中台指标体系如何赋能企业运营
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
9月前
|
存储 机器学习/深度学习 人工智能
使用 LangChain + Higress + Elasticsearch 构建 RAG 应用
本文介绍了如何利用LangChain、Higress和Elasticsearch快速构建RAG(检索增强生成)应用,实现企业知识的智能检索与问答。首先通过LangChain解析Markdown文档并写入Elasticsearch,接着部署Higress AI网关并配置ai-search插件以整合私有知识库与在线搜索功能。最后,通过实际案例展示了RAG查询流程及结果更新机制,确保内容准确性和时效性。文章还提供了相关参考资料以便进一步学习。
828 38
|
10月前
|
存储 人工智能 监控
通过Milvus和Langchain快速构建基于百炼大模型的LLM问答系统
阿里云向量检索服务Milvus版是一款全托管向量检索引擎,并确保与开源Milvus的完全兼容性,支持无缝迁移。它在开源版本的基础上增强了可扩展性,能提供大规模AI向量数据的相似性检索服务。凭借其开箱即用的特性、灵活的扩展能力和全链路监控告警,Milvus云服务成为多样化AI应用场景的理想选择,包括多模态搜索、检索增强生成(RAG)、搜索推荐、内容风险识别等。您还可以利用开源的Attu工具进行可视化操作,进一步促进应用的快速开发和部署。
1043 4

热门文章

最新文章