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

Langchain 和 LlamaIndex 提供了易于使用的抽象,方便在 Jupyter notebook 中进行快速实验和原型设计。但在生产环境中,组件需要模块化、易于扩展和伸缩,这成为了一大挑战。Cognita 正是为此而生。
Cognita 在底层使用 Langchain/LlamaIndex,并为您的代码库提供了清晰的组织结构,使 RAG 的每个组件都模块化、API 驱动且易于扩展。您可以在本地轻松使用 Cognita,同时它也提供了生产就绪的环境和无代码 UI 支持。Cognita 默认支持增量索引。
您可以在这里体验 Cognita: https://cognita.truefoundry.com

model gateway,通过单个文件管理所有模型及其配置。local.metadata.yaml 文件。您可以通过 UI 创建集合、数据源并对其进行索引,无需任何代码更改。Cognita 是一个开源框架,用于组织您的 RAG 代码库,并提供一个前端界面,方便您尝试不同的 RAG 定制。它提供了一种简单的方法来组织代码,使您既能轻松在本地测试,又能部署到生产级环境中。从 Jupyter Notebook 转向生产级 RAG 系统时出现的关键问题包括:
Cognita 让您能轻松定制和试验 RAG 系统的每个部分,同时保证良好的部署性。它还附带 UI,方便您实时尝试不同的 RAG 配置并查看结果。您可以在本地使用它,无论是否使用 Truefoundry 组件均可。使用 Truefoundry 组件可以更方便地测试不同模型和可扩展地部署系统。Cognita 允许您用一个应用托管多个 RAG 系统。
相似性搜索、查询分解、文档重排序等功能。mixedbread-ai 的 SOTA 开源嵌入和重排序模型。ollama 运行 LLM。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.env 文件获取环境变量。您可以根据需要修改它。cognita-db - 用于存储集合和数据源元数据的 Postgres 实例。qdrant-server - 用于启动本地向量数据库服务器。cognita-backend - 用于启动 Cognita 的 FastAPI 后端服务器。cognita-frontend - 用于启动 Cognita 的前端。http://localhost:6333 访问 qdrant 服务器,通过 http://localhost:8000 访问后端,通过 http://localhost:5001 访问前端。要启动 ollama 和 infinity-server 等其他服务,可以运行以下命令:
docker-compose --env-file compose.env --profile ollama --profile infinity up
这将为 ollama 和 infinity-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
Docker Compose 是在本地运行整个 Cognita 系统的好方法。您在 backend 文件夹中所做的任何更改都会自动反映在运行中的后端服务器中。您可以通过修改后端代码来测试不同的 API 和端点。

总体而言,Cognita 的架构由几个实体组成:
数据源 - 包含待索引文档的位置。通常是 S3 存储桶、数据库、TrueFoundry Artifacts 或本地磁盘。
元数据存储 - 此存储包含集合本身的元数据。一个集合是指来自一个或多个数据源的一组文档。对于每个集合,集合元数据存储:
LLM 网关 - 这是一个中央代理,允许以统一的 API 格式将请求代理到多个提供商的嵌入和 LLM 模型。可以是 OpenAIChat、OllamaChat,甚至是使用 TF LLM Gateway 的 TruefoundryChat。
向量数据库 - 存储集合的解析文件的嵌入和元数据。可以查询它以获取相似的块或基于过滤器的精确匹配。我们目前支持 Qdrant 和 SingleStore 作为向量数据库的选择。
索引任务 - 这是一个负责编排索引流程的异步任务。可以手动启动索引,也可以按 cron 计划定期运行。它将:
此代码位于
backend/indexer/
API 服务器 - 该组件同步处理用户查询并生成带引用的答案。每个应用程序完全控制检索和答案生成过程。一般来说,当用户发送请求时:
此组件的代码位于
backend/server/
openai 的 text-ada-002 或 mixedbread-ai 的 mxbai-embed-large-v1 等嵌入模型对块进行嵌入。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)
```
Langchain 的 OpenAIEmbeddings 来生成嵌入。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 下注册该向量数据库。负责实现 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中实现了一个示例控制器。请参考以更好地理解。
要对您自己的文档进行查询,请按照以下步骤操作:
在 TrueFoundry 注册,参考 这里
提交后,您将被重定向到您的仪表板端点,即 https://.truefoundry.cloud注意:请记下您的仪表板端点,我们将其称为 "TFY_HOST",其结构应为
https://<org_name>.truefoundry.cloud
设置集群,使用 TrueFoundry 托管以快速设置
注册添加一个 Docker 注册表 以推送您的 Docker 镜像跳过此步骤添加存储集成
创建 ML 仓库
+ 新建 ML 仓库 按钮提交后,您的 ML 仓库 将创建成功更多详情:链接
创建工作区
+ 新建工作区 按钮添加 ML 仓库访问提交后,将创建一个新的 工作区。您可以通过点击 FQN 复制 工作区 FQN。更多详情:链接
部署 RAG 应用程序
+ 新建部署 按钮应用程序目录main 分支进行部署(您会在 显示高级字段 中找到此选项)。如有必要,您可以更改分支名称和 Git 仓库。提交,您的应用程序将被部署。以下步骤将展示如何使用 cognita UI 查询文档:
创建数据源
数据源 标签页
+ 新建数据源本地目录,请从您的机器上传文件,然后点击提交。
创建集合
集合 标签页+ 新建集合
处理 以创建集合并索引数据。
创建集合后,数据摄取立即开始。您可以在集合标签页中选择您的集合来查看其状态。您也可以稍后添加其他数据源并对其进行索引。

生成响应

我们始终欢迎您的贡献!如果您有任何想法、反馈,或发现任何问题,请随时贡献。在贡献之前,请阅读 贡献指南。
欢迎为以下即将推出的开发做出贡献:
Chroma、Weaviate 等其他向量数据库标量 + 二进制量化 嵌入RAG 评估RAG 可视化stable-lm-3b、dragon-yi-6b 等GraphDB