Cognita:构建生产就绪的应用程序!(开源)

5 篇文章 0 订阅
3 篇文章 0 订阅

了解 Cognita 如何简化组织代码库的过程,同时提供用于探索各种 RAG 自定义的多功能前端。 了解它如何促进本地无缝测试以及在生产就绪环境中轻松部署。

为什么使用Cognita?

Langchain/LlamaIndex 提供易于使用的抽象,可用于在 Jupyter Notebook 上进行快速实验和原型设计。 但是,当产品投入生产时,会遇到一些限制,例如组件应该是模块化的、易于扩展和扩展。 这就是 Cognita 发挥作用的地方。 Cognita 在底层使用 Langchain/Llamaindex 并为您的代码库提供组织,其中每个 RAG 组件都是模块化、API 驱动且易于扩展的。 Cognita 可以在本地设置中轻松使用,同时为您提供生产就绪环境以及无代码 UI 支持。 Cognita 默认情况下还支持增量索引。

介绍

Cognita 是一个开源框架,用于组织 RAG 代码库以及用于处理不同 RAG 自定义的前端。 它提供了一种简单的方法来组织代码库,以便轻松在本地测试它,同时还能够将其部署在生产就绪环境中。 从 Jupyter Notebook 生产 RAG 系统时出现的关键问题是:

  1. 分块和嵌入作业:分块和嵌入代码通常需要抽象出来并作为作业部署。 有时,作业需要按计划运行或通过事件触发以保持数据更新。
  2. 查询服务:从查询生成答案的代码需要封装在像 FastAPI 这样的 API 服务器中,并且应该作为服务进行部署。 该服务应该能够同时处理多个查询,并且还可以随着流量的增加而自动扩展。
  3. LLM/嵌入模型部署:通常,如果我们使用开源模型,我们会在 Jupyter 笔记本中加载模型。 这需要在生产中作为单独的服务托管,并且模型需要作为 API 调用。
  4. 矢量数据库部署:大多数测试发生在内存或磁盘中的矢量数据库上。 然而,在生产中,需要以更具可扩展性和更可靠的方式部署数据库。

Cognita 使定制和试验有关 RAG 系统的所有内容变得非常容易,并且仍然能够以良好的方式部署它。 它还附带一个 UI,可以更轻松地尝试不同的 RAG 配置并实时查看结果。 您可以在本地使用它,也可以使用/不使用任何 Truefoundry 组件。 然而,使用 Truefoundry 组件可以更轻松地测试不同的模型并以可扩展的方式部署系统。 Cognita 允许您使用一个应用程序托管多个 RAG 系统。

使用 Cognita 的优点是:
  1. 解析器、加载器、嵌入器和检索器的中央可重用存储库。
  2. 非技术用户能够使用 UI - 上传文档并使用开发团队构建的模块执行 QnA。
  3. 完全 API 驱动 - 允许与其他系统集成。
    如果您将 Cognita 与 Truefoundry AI Gateway 结合使用,您可以获得用户查询的日志记录、指标和反馈机制。

特征:

  1. 支持使用相似性搜索、查询分解、文档重新排名等的多个文档检索器
  2. 支持 SOTA 开源嵌入和来自 mixbread-ai 的重新排名
  3. 支持使用 Ollama 来使用法学硕士
  4. 支持增量索引,批量提取整个文档(减少计算负担),跟踪已索引的文档并防止对这些文档重新索引。
入门

您可以使用 python 脚本或使用代码附带的 UI 组件在本地使用代码。

安装Python并设置虚拟环境

在使用 Cognita 之前,您需要确保系统上安装了 Python >=3.10.0,并且您可以创建虚拟环境以实现更安全、更简洁的项目设置。

设置虚拟环境

建议使用虚拟环境以避免与其他项目或系统范围的Python包发生冲突。

创建虚拟环境:

导航到终端中项目的目录。 运行以下命令创建一个名为 venv 的虚拟环境(您可以将其命名为任何您喜欢的名称):

python3 -m venv ./venv
激活虚拟环境:
  • 在 Windows 上,通过运行以下命令激活虚拟环境:
venv\Scripts\activate.bat
  • 在 macOS 和 Linux 上,使用以下命令激活它:
source venv/bin/activate

激活虚拟环境后,您将在终端提示符中看到其名称。 现在,您可以按照快速入门部分中提供的步骤安装 Cognita。

使用完 Cognita 后,请记住通过在终端中运行 deactivate 来停用虚拟环境。

快速入门:本地运行 Cognita

以下是在本地运行 Cognita 且无需任何其他 Truefoundry 依赖项的说明

安装必要的包:

在项目根目录中执行以下命令:

pip install -r backend/requirements.txt
设置 .env 文
  • 通过从 env.local.example 复制副本来创建 .env 文件并设置相关字段。
执行代码:
  • 现在我们通过从项目根目录执行以下命令来索引数据(样本数据/信用卡):
python -m local.ingest
  • 要运行查询,请从项目根目录执行以下命令:

这些命令使用 local.metadata.yaml 文件,您可以在其中设置 qdrant 集合名称、不同的数据源路径和嵌入器配置。

您可以通过从 run.py 中的 backend.modules.query_controllers.example.payload 导入来尝试不同的检索器和查询

您还可以启动 FastAPI 服务器: uvicorn --host 0.0.0.0 --port 8000 backend.server.app:app --reload 然后,Swagger 文档将位于: http://localhost:8000/ 对于本地版本,您 不需要使用 API 创建数据源、收集或索引它们,因为它由 local.metadata.yaml 和 ingest.py 文件处理。 您可以直接尝试检索器端点。

要使用前端 UI 进行查询,您可以转到:cd fronend 并执行yarn dev 来启动 UI 并进行操作。 更多内容请参阅前端自述文件

项目架构

总体而言,Cognita 的架构由多个实体组成

Cognita 组件:

  1. 数据源 - 这些是包含要索引的文档的位置。 通常这些是 S3 存储桶、数据库、TrueFoundry Artifacts 甚至本地磁盘
  2. 元数据存储 - 此存储包含有关集合本身的元数据。 集合是指来自一个或多个数据源的一组文档的组合。 对于每个集合,集合元数据存储     
     
    1. 藏品名称
    2. 关联的 Vector DB 集合的名称
    3. 链接数据源
    4. 解析每个数据源的配置
    5. 要使用的嵌入模型和配置   
  3. LLM 网关 - 这是一个中央代理,允许使用统一的 API 格式代理跨多个提供商的各种嵌入和 LLM 模型的请求。 这可以是 OpenAIChat、OllamaChat,甚至是使用 TF LLM Gateway 的 TruefoundryChat。
  4. Vector DB - 它存储集合的已解析文件的嵌入和元数据。 可以查询它以获取相似的块或基于过滤器的精确匹配。 我们目前支持 Qdrant 和 SingleStore 作为我们选择的矢量数据库。
  5. 索引作业 - 这是一个异步作业,负责编排索引流程。 索引可以手动启动或按 cron 计划定期运行。 它会
    1. 扫描数据源以获取文档列表
    2. 检查Vector DB状态以过滤掉未更改的文档
    3. 下载并解析文件以创建具有关联元数据的较小块
    4. 使用 AI Gateway 嵌入这些块并将其放入 Vector DB
    5. 其源代码位于 backend/indexer/
  6. API 服务器 - 该组件处理用户查询以同步生成带有引用的答案。 每个应用程序都可以完全控制检索和应答过程。 广义上讲,当用户发送请求时
    1. 相应的查询控制器根据配置引导检索器或多步骤代理。
    2. 使用 AI 网关处理和嵌入用户的问题。
    3. 一个或多个检索器与 Vector DB 交互以获取相关块和元数据。
    4. 最终答案是通过人工智能网关使用法学硕士形成的。
    5. 可以选择丰富在此过程中获取的相关文档的元数据。 例如。 添加预签名 URL。
    6. 该组件的代码位于backend/server/
数据索引:
  1. 某个计划上的 Cron 将触发索引作业
  2. 扫描与集合关联的数据源以查找所有数据点(文件)
  3. 该作业将 VectorDB 状态与数据源状态进行比较,以找出新添加的文件、更新的文件和删除的文件。 下载新文件和更新的文件
  4. 新添加的文件和更新的文件被解析并分成更小的部分,每个部分都有自己的元数据
  5. 这些块是使用嵌入模型嵌入的,例如来自 openai 的 text-ada-002 或来自 mixbread-ai 的 mxbai-embed-large-v1
  6. 嵌入的块被放入 VectorDB 中,并自动生成和提供元数据
使用 API Server 进行问答:
  1. 用户发送带有查询的请求
  2. 它被路由到应用程序的查询控制器之一
  3. 在 Vector DB 之上构建一个或多个检索器
  4. 然后构建问答链/代理。 它嵌入用户查询并获取相似的块。
  5. 单次问答链仅在给定相似块的情况下生成答案。 在得出答案之前,智能体可以进行多步骤推理并使用许多工具。 在这两种情况下,API 服务器都使用 LLM 模型(如 GPT 3.5、GPT 4 等)
  6. 在返回答案之前,可以使用预签名 URL、周围幻灯片、外部数据源链接等内容更新相关块的元数据。
  7. 答案和相关文档块作为响应返回。
    注意:如果是代理,中间步骤也可以流式传输。 由具体应用程序决定。
代码结构:

整个代码库位于 backend/

.
|-- Dockerfile
|-- README.md
|-- __init__.py
|-- backend/
|   |-- indexer/
|   |   |-- __init__.py
|   |   |-- indexer.py
|   |   |-- main.py
|   |   `-- types.py
|   |-- modules/
|   |   |-- __init__.py
|   |   |-- dataloaders/
|   |   |   |-- __init__.py
|   |   |   |-- loader.py
|   |   |   |-- localdirloader.py
|   |   |   `-- ...
|   |   |-- embedder/
|   |   |   |-- __init__.py
|   |   |   |-- embedder.py
|   |   |   -- mixbread_embedder.py
|   |   |   `-- embedding.requirements.txt
|   |   |-- metadata_store/
|   |   |   |-- base.py
|   |   |   |-- client.py
|   |   |   `-- truefoundry.py
|   |   |-- parsers/
|   |   |   |-- __init__.py
|   |   |   |-- parser.py
|   |   |   |-- pdfparser_fast.py
|   |   |   `-- ...
|   |   |-- query_controllers/
|   |   |   |-- default/
|   |   |   |   |-- controller.py
|   |   |   |   `-- types.py
|   |   |   |-- query_controller.py
|   |   |-- reranker/
|   |   |   |-- mxbai_reranker.py
|   |   |   |-- reranker.requirements.txt
|   |   |   `-- ...
|   |   `-- vector_db/
|   |       |-- __init__.py
|   |       |-- base.py
|   |       |-- qdrant.py
|   |       `-- ...
|   |-- requirements.txt
|   |-- server/
|   |   |-- __init__.py
|   |   |-- app.py
|   |   |-- decorators.py
|   |   |-- routers/
|   |   `-- services/
|   |-- settings.py
|   |-- types.py
|   `-- utils.py
为您的用例定制代码

Cognita 使得在解析器、加载器、模型和检索器之间切换变得非常容易。

自定义数据加载器:
  • 您可以通过从 backend/modules/dataloaders/loader.py 继承 BaseDataLoader 类来编写自己的数据加载器
  • 最后,在 backend/modules/dataloaders/__init__.py 中注册加载器
  • 在 root 目录中的 localdir 上测试数据加载器,将以下代码复制为 test.py 并执行它。 我们在这里展示如何测试现有的 LocalDirLoader:
from backend.modules.dataloaders import LocalDirLoader
from backend.types import DataSource

data_source = DataSource(
type="local",
uri="sample-data/creditcards",
)

loader = LocalDirLoader()


loaded_data_pts = loader.load_full_data(
    data_source=data_source,
    dest_dir="test/creditcards",
)


for data_pt in loaded_data_pts:
    print(data_pt)
定制嵌入器:
  • 代码库当前使用 OpenAIEmbeddings,您可以将其注册为默认值。
  • 您可以在 backend/modules/embedder/__init__.py 中注册自定义嵌入
  • 您还可以添加自己的嵌入器,其示例在 backend/modules/embedder/mixbread_embedder.py 下给出。 它继承了langchain嵌入类。
自定义解析器:
  • 您可以通过从 backend/modules/parsers/parser.py 继承 BaseParser 类来编写自己的解析器
  • 最后,在 backend/modules/parsers/__init__.py 中注册解析器
  • 在根目录中的本地文件上测试解析器,将以下代码复制为 test.py 并执行它。 这里我们展示如何测试现有的 MarkdownParser:
import asyncio
from backend.modules.parsers import MarkdownParser

parser = MarkdownParser()
chunks =  asyncio.run(
    parser.get_chunks(
        filepath="sample-data/creditcards/diners-club-black.md",
    )
)
print(chunks)
添加自定义 VectorDB:
  • 要为 VectorDB 添加您自己的接口,您可以从 backend/modules/vector_db/base.py 继承 BaseVectorDB
  • 在 backend/modules/vector_db/__init__.py 下注册 vectordb
重新排序:
  • 重新排序器用于对相关文档进行排序,以便可以将前 k 个文档用作上下文,从而有效地减少一般上下文和提示。
  • 示例重新排序器编写在 backend/modules/reranker/mxbai_reranker.py 下

编写查询控制器 (QnA):

负责实现 RAG 应用程序的查询接口的代码。 这些查询控制器中定义的方法将添加到 FastAPI 服务器的路由。

添加自定义查询控制器的步骤:
  • 在 backend/modules/query_controllers/ 中添加查询控制器类
  • 将 query_controller 装饰器添加到您的类中,并将自定义控制器的名称作为参数传递
from backend.server.decorator import query_controller

@query_controller("/my-controller")
class MyCustomController():
    ...
  • 根据您的需要向此控制器添加方法,并使用我们的 http 装饰器(例如 post、get、delete)使您的方法成为 API
from backend.server.decorator import post

@query_controller("/my-controller")
class MyCustomController():
    ...

    @post("/answer")
    def answer(query: str):
        # Write code to express your logic for answer
        # This API will be exposed as POST /my-controller/answer
        ...
  • 在 backend/modules/query_controllers/__init__.py 导入自定义控制器类
...
from backend.modules.query_controllers.sample_controller.controller import MyCustomController

作为示例,我们在 backend/modules/query_controllers/example 中实现了示例控制器。 请参考以获得更好的理解

下载资源:Cognita

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值