2 个不稳定版本

0.2.0 2024 年 8 月 21 日
0.1.0 2024 年 7 月 19 日

#424 in 文本处理

Download history 110/week @ 2024-07-17 5/week @ 2024-07-24

每月 115 次下载

MIT 许可证

76KB
2K SLoC

Ragtime

Ragtime 是一个 Rust 库,使构建自托管检索增强生成 (RAG) 应用程序变得更加容易。目前它使用 Phi3 进行问答和摘要,并支持多个嵌入模型。它有一个通用的模型接口,以促进整合可用的其他模型。

目前支持 onnx 和 llama.cpp 后端来运行模型,随着这些后端的成熟,可能还会添加额外的后端(例如 burn 或 candle)。

目前,使用 gte-Qwen2-instruct 嵌入模型系列和 Phi3 获得的最佳结果。这种组合可以在相同的向量数据库中索引源代码和文本文档,用于问答或简单的检索。

use ragtime::{llama, RagQaPhi3GteQwen27bInstruct};
use llama_cpp_2::llama_backend::LlamaBackend;
use anyhow::Result;
use std::{io::{stdout, Write}, sync::Arc};

let backend = Arc::new(LlamaBackend::init()?);
let mut qa = RagQaPhi3GteQwen27bInstruct::new(
    64,
    backend.clone(),
    llama::Args::default().with_model("gte-Qwen2-7B-instruct/ggml-model-q8_0.gguf"),
    backend,
    llama::Args::default().with_model("Phi-3-mini-128k-instruct/ggml-model-q8_0.gguf")
)?;

// add documents
qa.add_document("doc0", 256, 128)?;
qa.add_document("doc1", 256, 128)?;

// query
for tok in qa.ask("question about your docs", None)? {
    let tok = tok?;
    print!("{tok}");
    stdout().flush()?;
}

虽然拉格泰姆不直接使用任何异步运行时,但其基于迭代器的返回机制使得将其放入后台线程并将令牌推入 IPC 机制(如 mpsc 通道)非常简单。这使得它对异步运行时不可知,并更容易用于非异步应用程序,如命令行工具。

实用工具

除了核心 crate 之外,utils 文件夹中还有一些简单的命令行包装器。

  • qa:一个问答命令行实用工具,可以摄取文档、持久化并加载索引,并提供问答 REPL
  • gen:一个用于运行没有 RAG 支持的 Phi3 会话的驱动程序
  • chunk:一个实用工具,用于显示文档将如何分割成块

模型

Phi3 和所有支持的嵌入模型权重都可在 hugging face 上找到。在某些情况下,您需要使用 llama.cpp 仓库中包含的 Python 脚本将它们转换为 gguf 格式。对于 onnx 模型,许多模型可以直接从 hugging face 下载,否则您必须将它们从 hugging face 格式转换。

部署

如果使用 CPU 或 Vulkan 加速,则可以以最小依赖项部署 Ragtime 应用程序。在 cuda 的情况下,只需要 cuda 运行时。

依赖关系

~28–43MB
~791K SLoC