OA0
OA0 是一个探索 AI 的社区
现在注册
已注册用户请  登录
OA0  ›  代码  ›  Cognita — 聚焦 RAG 应用落地的开源知识助手框架

Cognita — 聚焦 RAG 应用落地的开源知识助手框架

 
  change ·  2026-08-11 11:00:17 · 19 次点击  · 0 条评论  

[!Note]
本项目不再积极维护,感谢所有贡献者的支持。

Cognita

RAG_TF

为什么选择 Cognita?

Langchain 和 LlamaIndex 提供了易于使用的抽象,方便在 Jupyter notebook 中进行快速实验和原型设计。但在生产环境中,组件需要模块化、易于扩展和伸缩,这成为了一大挑战。Cognita 正是为此而生。

Cognita 在底层使用 Langchain/LlamaIndex,并为您的代码库提供了清晰的组织结构,使 RAG 的每个组件都模块化、API 驱动且易于扩展。您可以在本地轻松使用 Cognita,同时它也提供了生产就绪的环境和无代码 UI 支持。Cognita 默认支持增量索引。

您可以在这里体验 Cognita: https://cognita.truefoundry.com

RAG_TF

🎉 Cognita 最新动态

  • [2024年9月] Cognita 现支持 AudioParser (https://github.com/fedirz/faster-whisper-server) 和 VideoParser (AudioParser + MultimodalParser)。
  • [2024年8月] Cognita 已迁移至 pydantic v2。
  • [2024年7月] 引入 model gateway,通过单个文件管理所有模型及其配置。
  • [2024年6月] Cognita 现在支持由 Prisma 和 Postgres 驱动的自有元数据存储。您可以完全通过 UI 使用 Cognita,无需 local.metadata.yaml 文件。您可以通过 UI 创建集合、数据源并对其进行索引,无需任何代码更改。
  • [2024年6月] 新增一键本地部署功能。您现在可以使用 docker-compose 运行整个 Cognita 系统,简化了本地测试和开发。
  • [2024年5月] 新增对 Infninty Server 的嵌入和重排序支持。您可以使用 Huggingface 上提供的多种托管嵌入和重排序服务,减轻主系统负担并提高可扩展性。
  • [2024年5月] 清理了向量数据库、解析器、嵌入器和重排序器等可选软件包的安装要求。
  • [2024年5月] 支持使用参数进行有条件的 Docker 构建,以安装可选软件包。
  • [2024年4月] 支持使用 GPT-4 进行多模态视觉解析。

目录

简介

Cognita 是一个开源框架,用于组织您的 RAG 代码库,并提供一个前端界面,方便您尝试不同的 RAG 定制。它提供了一种简单的方法来组织代码,使您既能轻松在本地测试,又能部署到生产级环境中。从 Jupyter Notebook 转向生产级 RAG 系统时出现的关键问题包括:

  1. 分块和嵌入任务:分块和嵌入代码通常需要抽象出来并作为单独任务部署。该任务可能需要定时运行或通过事件触发以保持数据更新。
  2. 查询服务:根据查询生成答案的代码需要封装在 FastAPI 等 API 服务器中,并作为服务部署。该服务应能同时处理多个查询,并在流量增加时自动扩展。
  3. LLM / 嵌入模型部署:在使用开源模型时,我们通常在 Jupyter notebook 中加载模型。在生产环境中,这需要作为独立服务托管,并通过 API 调用模型。
  4. 向量数据库部署:大多数测试在内存或磁盘上的向量数据库(如 Chroma、FAISS)中进行。但在生产环境中,数据库需要以更可扩展、更可靠的方式部署(如 Qdrant、Pinecone)。

Cognita 让您能轻松定制和试验 RAG 系统的每个部分,同时保证良好的部署性。它还附带 UI,方便您实时尝试不同的 RAG 配置并查看结果。您可以在本地使用它,无论是否使用 Truefoundry 组件均可。使用 Truefoundry 组件可以更方便地测试不同模型和可扩展地部署系统。Cognita 允许您用一个应用托管多个 RAG 系统。

使用 Cognita 的优势

  1. 拥有集中且可复用的解析器、加载器、嵌入器和检索器库。
  2. 非技术用户可以通过 UI 进行操作——上传文档并使用开发团队构建的模块进行问答。
  3. 完全 API 驱动——便于与其他系统集成。
    > 如果您将 Cognita 与 Truefoundry AI Gateway 结合使用,可以获得用户查询的日志、指标和反馈机制。

功能特性

  1. 支持多种文档检索器,使用相似性搜索查询分解文档重排序等功能。
  2. 支持来自 mixedbread-ai 的 SOTA 开源嵌入和重排序模型。
  3. 支持使用 ollama 运行 LLM。
  4. 支持增量索引,分批摄取整个文档(减少计算负担),跟踪已索引的文档并避免重复索引。

:rocket: 快速开始:在本地运行 Cognita

:whale: 使用 Docker Compose (推荐 - 版本 25+)

Cognita 及其所有服务都可以使用 docker-compose 运行。这是在本地运行 Cognita 的推荐方式。请从 Docker Compose 为您的系统安装 Docker 和 docker-compose。

配置模型提供商

在启动服务之前,我们需要配置嵌入和生成答案所需的模型提供商。

首先,将 models_config.sample.yaml 复制为 models_config.yaml

cp models_config.sample.yaml models_config.yaml

默认配置启用了本地提供商,需要 infinity 和 ollama 服务器在本地运行嵌入和 LLM。
如果您有 OpenAI API 密钥,可以在 models_config.yaml 中取消注释 openai 提供商,并在 compose.env 中更新 OPENAI_API_KEY

现在,您可以运行以下命令启动服务:

docker-compose --env-file compose.env up
  • Compose 文件使用 compose.env 文件获取环境变量。您可以根据需要修改它。
  • Compose 文件将启动以下服务:
  • cognita-db - 用于存储集合和数据源元数据的 Postgres 实例。
  • qdrant-server - 用于启动本地向量数据库服务器。
  • cognita-backend - 用于启动 Cognita 的 FastAPI 后端服务器。
  • cognita-frontend - 用于启动 Cognita 的前端。
  • 服务启动后,您可以通过 http://localhost:6333 访问 qdrant 服务器,通过 http://localhost:8000 访问后端,通过 http://localhost:5001 访问前端。

要启动 ollamainfinity-server 等其他服务,可以运行以下命令:

docker-compose --env-file compose.env --profile ollama --profile infinity up
  • 这将为 ollamainfinity-server 启动额外的服务器,分别用于 LLM、嵌入和重排序。您可以通过 http://localhost:7997 访问 infinity-server

  • 如果您想在本地构建后端/前端镜像,例如在添加新需求/包或拉取 GitHub 新更新时,可以在命令中添加 --build 标志。

docker-compose --env-file compose.env up --build

或者

docker-compose --env-file compose.env --profile ollama --profile infinity up --build

在 Cognita 中进行开发

Docker Compose 是在本地运行整个 Cognita 系统的好方法。您在 backend 文件夹中所做的任何更改都会自动反映在运行中的后端服务器中。您可以通过修改后端代码来测试不同的 API 和端点。

:hammer_and_pick: 项目架构

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

Cognita 组件

  1. 数据源 - 包含待索引文档的位置。通常是 S3 存储桶、数据库、TrueFoundry Artifacts 或本地磁盘。

  2. 元数据存储 - 此存储包含集合本身的元数据。一个集合是指来自一个或多个数据源的一组文档。对于每个集合,集合元数据存储:

    • 集合名称
    • 关联的向量数据库集合名称
    • 关联的数据源
    • 每个数据源的解析配置
    • 要使用的嵌入模型及其配置
  3. LLM 网关 - 这是一个中央代理,允许以统一的 API 格式将请求代理到多个提供商的嵌入和 LLM 模型。可以是 OpenAIChat、OllamaChat,甚至是使用 TF LLM Gateway 的 TruefoundryChat。

  4. 向量数据库 - 存储集合的解析文件的嵌入和元数据。可以查询它以获取相似的块或基于过滤器的精确匹配。我们目前支持 QdrantSingleStore 作为向量数据库的选择。

  5. 索引任务 - 这是一个负责编排索引流程的异步任务。可以手动启动索引,也可以按 cron 计划定期运行。它将:

    • 扫描数据源以获取文档列表
    • 检查向量数据库状态以过滤掉未更改的文档
    • 下载并解析文件以创建带有相关元数据的较小块
    • 使用 AI Gateway 嵌入这些块并将其放入向量数据库

      此代码位于 backend/indexer/

  6. API 服务器 - 该组件同步处理用户查询并生成带引用的答案。每个应用程序完全控制检索和答案生成过程。一般来说,当用户发送请求时:

    • 相应的查询控制器根据配置引导检索器或多步代理。
    • 用户的问题通过 AI Gateway 进行处理和嵌入。
    • 一个或多个检索器与向量数据库交互以获取相关块和元数据。
    • 通过 AI Gateway 使用 LLM 形成最终答案。
    • 可以选择性地丰富在此过程中获取的相关文档的元数据。例如,添加预签名 URL。

      此组件的代码位于 backend/server/

数据索引

  1. 某个计划任务将触发索引任务。
  2. 扫描与集合关联的数据源以获取所有数据点(文件)。
  3. 该任务将向量数据库状态与数据源状态进行比较,以找出新增文件、更新文件和已删除文件。新文件和更新文件将被下载
  4. 新添加和更新的文件将被解析和分块为更小的部分,每个部分都有自己的元数据。
  5. 使用诸如 openaitext-ada-002mixedbread-aimxbai-embed-large-v1 等嵌入模型对块进行嵌入
  6. 嵌入的块连同自动生成和提供的元数据被放入向量数据库。

:question: 使用 API 服务器进行问答

  1. 用户发送带有查询的请求。
  2. 请求被路由到某个应用的查询控制器。
  3. 在向量数据库之上构建一个或多个检索器。
  4. 然后构建一个问答链/代理。它嵌入用户查询并获取相似的块。
  5. 单次问答链仅根据相似的块生成答案。代理可以在得出答案之前进行多步推理并使用许多工具。在这两种情况下,API 服务器都使用 LLM 模型(如 GPT 3.5、GPT 4 等)。
  6. 在返回答案之前,可以用预签名 URL、周边幻灯片、外部数据源链接等内容更新相关块的元数据。
  7. 答案和相关文档块将在响应中返回。
    注意: 对于代理,中间步骤也可以流式传输。这取决于具体应用的决定。

根据您的用例定制代码

Cognita 遵循的口号是:

一切皆可用,一切皆可定制。

Cognita 让您可以轻松地在解析器、加载器、模型和检索器之间切换。

自定义数据加载器

  • 您可以通过继承 backend/modules/dataloaders/loader.py 中的 BaseDataLoader 类来编写自己的数据加载器。
  • 最后,在 backend/modules/dataloaders/__init__.py 中注册该加载器。
  • 在根目录下,将以下代码复制为 test.py 并执行以测试本地目录中的数据加载器。这里我们展示如何测试现有的 LocalDirLoader

```python
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)
```

自定义嵌入器

  • 代码库目前默认使用 LangchainOpenAIEmbeddings 来生成嵌入。
  • 您可以在 models_config.yaml 文件中注册任何兼容 OpenAI 的自定义嵌入,然后重启服务器即可生效。

自定义解析器

  • 您可以通过继承 backend/modules/parsers/parser.py 中的 BaseParser 类来编写自己的解析器。
  • 最后,在 backend/modules/parsers/__init__.py 中注册该解析器。
  • 在根目录下,将以下代码复制为 test.py 并执行以测试本地文件的解析器。这里我们展示如何测试现有的 MarkdownParser

```python
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)
```

添加自定义向量数据库

  • 要为向量数据库添加您自己的接口,可以从 backend/modules/vector_db/base.py 继承 BaseVectorDB
  • backend/modules/vector_db/__init__.py 下注册该向量数据库。

:bulb: 编写您的查询控制器 (QnA)

负责实现 RAG 应用程序查询接口的代码。这些查询控制器中定义的方法会成为您 FastAPI 服务器上的路由。

添加自定义查询控制器的步骤

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

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

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

    @post("/answer")
    def answer(query: str):
        # 编写代码来表达您的答案逻辑
        # 此 API 将作为 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 中实现了一个示例控制器。请参考以更好地理解。

:whale: 快速开始:使用 Truefoundry 部署

要对您自己的文档进行查询,请按照以下步骤操作:

  1. 在 TrueFoundry 注册,参考 这里

    • 填写表格并注册为组织(假设为 )
    • 点击提交后,您将被重定向到您的仪表板端点,即 https://.truefoundry.cloud
    • 完成电子邮件验证
    • 在您的仪表板端点登录平台,即 https://.truefoundry.cloud

      注意:请记下您的仪表板端点,我们将其称为 "TFY_HOST",其结构应为 https://<org_name>.truefoundry.cloud

  2. 设置集群,使用 TrueFoundry 托管以快速设置

    • 为您的 集群 起一个唯一名称,然后点击启动集群
    • 预置集群可能需要几分钟时间
    • 配置主机域 部分,为预填的 IP 点击 注册
    • 接下来,添加一个 Docker 注册表 以推送您的 Docker 镜像
    • 接下来,部署一个模型,您可以选择跳过此步骤
  3. 添加存储集成

  4. 创建 ML 仓库

    • 导航到 ML 仓库 标签页
    • 点击右上角的 + 新建 ML 仓库 按钮
    • 为您的 ML 仓库 起一个唯一名称(例如 'docs-qa-llm')
    • 选择 存储集成
    • 点击提交后,您的 ML 仓库 将创建成功

      更多详情:链接

  5. 创建工作区

    • 导航到 工作区 标签页
    • 点击右上角的 + 新建工作区 按钮
    • 选择您的 集群
    • 为您的 工作区 起一个名称(例如 'docs-qa-llm')
    • 启用 ML 仓库访问添加 ML 仓库访问
    • 选择您的 ML 仓库 并将角色设为 项目管理员
    • 点击提交后,将创建一个新的 工作区。您可以通过点击 FQN 复制 工作区 FQN

      更多详情:链接

  6. 部署 RAG 应用程序

    • 导航到 部署 标签页
    • 点击右上角的 + 新建部署 按钮
    • 选择 应用程序目录
    • 选择您的工作区
    • 选择 RAG 应用程序
    • 填写部署模板
    • 为您的部署命名
    • 添加 ML 仓库
    • 您可以添加现有的 Qdrant 数据库或创建一个新的
    • 默认使用 main 分支进行部署(您会在 显示高级字段 中找到此选项)。如有必要,您可以更改分支名称和 Git 仓库。
      > 确保重新选择 main 分支,因为 SHA 提交不会自动更新。
    • 点击提交,您的应用程序将被部署。

使用 RAG UI

以下步骤将展示如何使用 cognita UI 查询文档:

  1. 创建数据源

    • 点击 数据源 标签页
      Datasource
    • 点击 + 新建数据源
    • 数据类型可以是本地目录文件、Web URL、GitHub URL,或提供 Truefoundry Artifact FQN。
    • 例如:如果选择 本地目录,请从您的机器上传文件,然后点击提交
    • 创建的数据源列表将显示在数据源标签页中。
      DataSourceList
  2. 创建集合

    • 点击 集合 标签页
    • 点击 + 新建集合
      collection
    • 输入集合名称
    • 选择嵌入模型
    • 添加之前创建的数据源及必要配置
    • 点击 处理 以创建集合并索引数据。
      ingestionstarted
  3. 创建集合后,数据摄取立即开始。您可以在集合标签页中选择您的集合来查看其状态。您也可以稍后添加其他数据源并对其进行索引。
    ingestioncomplete

  4. 生成响应
    responsegen

    • 选择集合
    • 选择 LLM 及其配置
    • 选择文档检索器
    • 编写提示词或使用默认提示词
    • 输入查询

:sparkling_heart: 开源贡献

我们始终欢迎您的贡献!如果您有任何想法、反馈,或发现任何问题,请随时贡献。在贡献之前,请阅读 贡献指南

:crystal_ball: 未来发展规划

欢迎为以下即将推出的开发做出贡献:

  • 支持 ChromaWeaviate 等其他向量数据库
  • 支持 标量 + 二进制量化 嵌入
  • 支持不同检索器的 RAG 评估
  • 支持 RAG 可视化
  • 支持带上下文的对话式聊天机器人
  • 支持 RAG 优化的 LLM,如 stable-lm-3bdragon-yi-6b
  • 支持 GraphDB

Star 历史

Star History Chart

19 次点击  ∙  0 人收藏  
登录后收藏  
0 条回复
关于 ·  帮助 ·  PING ·  隐私 ·  条款   
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
耗时 65 ms
Developed with Cursor