项目简介
wdoc
是一个强大的检索增强生成(RAG)系统,旨在总结、搜索和查询各种文件类型的文档。它特别适用于处理大量不同类型的文档,对于研究人员、学生和需要处理大量信息源的专业人士来说非常理想。我对所有其他查询或总结的 RAG 解决方案都感到沮丧,因此我制作了我的完美解决方案,并打包成一个单一的产品。
关键特性:
-
旨在支持任何文件类型,并同时查询所有文件(已实现 15 种以上!)
-
高召回率和特异性:它被设计用来通过精心设计的嵌入搜索找到大量文档,然后使用语义批量处理逐步聚合每个答案,以生成一个提及来源并指向源文档确切部分的单一答案。
-
支持几乎所有LLM提供商,包括本地提供商,甚至为超级机密内容提供额外的安全层。
-
使用昂贵和便宜的LLM来尽可能提高召回率,因为我们能够承担每次查询(通过嵌入)检索大量文档
-
终于有一个有用的 AI 生成摘要:获取作者的思考过程,而不是模糊的结论。
-
可扩展的,这既是工具也是库。
功能
-
15+ 文件类型:也支持递归加载或定义复杂异构语料库,如文件列表、链接列表、使用正则表达式、YouTube 播单等。请参阅支持的文件类型。所有文件类型都可以无缝组合在同一索引中,这意味着您可以在查询 Anki 收藏的同时查看您的 PDF 文件。它还支持从音频文件和 YouTube 视频中移除静音!
-
100+ LLMs:OpenAI、Mistral、Claude、Ollama、Openrouter 等。感谢 litellm。我个人使用 openrouter 的 deepseek v3 模型作为强大的LLM和评估LLM(之前:Claude Sonnet 3.5 和 gpt-4o-mini),以及 openai 嵌入。
-
本地和私有 LLM:采取一些措施确保没有数据离开您的电脑并流向 LLM 提供商:不使用 API 密钥,所有
api_base
都由用户设置,缓存与其它部分隔离,出站连接通过过载套接字进行审查等。 -
高级 RAG 查询大量多样化的文档:
-
支持特殊语法,如”QE >>>> QA”,其中 QE 是一个用于过滤嵌入的问题,QA 是你想要回答的实际问题。
-
使用嵌入检索文档
-
然后使用一个弱LLM模型(“Eve the Evaluator”)来判断哪些文档不相关
-
然后使用强LLM来回答(“Anna the Answerer”)问题,使用每个剩余的单独文档。
-
然后所有相关答案都合并成一个简短的 Markdown 格式答案(”Carl the Combiner”)。在合并之前,它们会使用 scipy 的层次聚类和叶排序按语义簇和语义顺序进行批量处理,这使得LLM能够以自下而上的方式更容易地合并答案。
Eve the Evaluator
、Anna the Answerer
和Carl the Combiner
是它们在系统提示中为每个LLM赋予的名称,这样您可以轻松地为特定步骤添加特定的附加指令。还有Sam the Summarizer
用于摘要和Raphael the Rephraser
用于扩展您的查询。 -
每份文档都通过一个唯一的哈希值进行标识,答案来源于这些文档,这意味着你知道每个答案的信息来自哪份文档。
-
高级摘要:
-
将作者的理由、论点、思考过程等压缩成易于浏览的 Markdown 文件,而不是无用的“高级要点”。
-
摘要随后再次检查 n 次,以确保正确的逻辑缩进等。
-
摘要可以使用与文档相同的语言,或者直接翻译。
-
许多任务:查看支持的任务。
-
信任但核实:答案来源:
wdoc
跟踪每个用于答案的文档的哈希值,允许您核实每个断言。 -
Markdown 格式化的答案和摘要:使用 rich。
-
合理嵌入:默认使用复杂的嵌入,如多查询检索器,但也包括 SVM、KNN、父检索器等。可定制。
-
全面文档化的大量文档字符串,大量代码注释,详细
--help
等。完整用法可在 USAGE.md 文件中找到或通过python -m wdoc --help
。我努力维护详尽的文档。 -
可脚本化/可扩展:您可以在其他 Python 项目中使用
wdoc
,通过--import_mode
。查看下面的脚本。 -
静态类型:运行时类型检查。通过环境标志禁用:
WDOC_TYPECHECKING="disabled / warn / crash" wdoc
(默认:warn
)。感谢 beartype,它甚至不会减慢代码速度! -
LLM(以及嵌入)缓存:加快速度,以及索引存储和加载(对大型集合很有用)。
-
优秀的 PDF 解析器臭名昭著地不可靠,因此使用了 15 个不同的加载器,并保留根据解析评分最好的一个。通过 openparse(默认无需 GPU)或通过 UnstructuredPDFLoader 支持表格。
-
Langfuse 支持:如果您设置了适当的 langfuse 环境变量,它们将被使用。请参阅此指南或这一篇以了解更多信息(注意:如果使用 private_mode,则此功能被禁用,以避免任何泄露)。
-
文档过滤:基于正则表达式对文档内容或元数据进行过滤。
-
快速:并行文档加载、解析、嵌入、查询等。
-
Python-Fire 的 Shell 自动补全
-
通知回调:可用于例如使用 ntfy.sh 在您的手机上获取摘要。
-
黑客思维:我是一个友好的开发者!如果你有功能请求或其他任何问题,只需打开一个问题即可。
支持的文件类型
-
auto: 默认,为您猜测文件类型
-
url: 尝试多种方式加载网页,使用启发式算法找到更好的解析方式
-
YouTube:文本来自 yt 字幕/翻译,或者更好的是使用 whisper/deepgram。请注意,YouTube 字幕是带有时码下载的(因此您可以询问“作者何时提到这样的内容”),但采样频率较低(而不是每秒一个时码,而是每 15 秒一个)。在总结时,YouTube 章节也被作为上下文提供给LLM,这可能会对其有很大帮助。
-
PDF:实现了 15 个默认加载器,使用启发式算法来保留最佳加载器并提前停止。通过 openparse 或 UnstructuredPDFLoader 支持表格。易于添加更多。
-
在线 PDF:通过 URL 访问,然后作为 PDF 处理(见上文)
-
Anki:Anki 集合数据库的任何子集。图像的
alt
和title
可以显示给LLM,这意味着如果您使用了 AnkiOCR 插件,这些信息将有助于为LLM的笔记提供上下文。 -
string:命令行提示您输入文本,以便您可以轻松粘贴内容,非常适合付费墙文章!
-
txt: .txt, markdown等
-
直接发送文本内容作为路径
-
local_html:用于网站抓取
-
logseq_markdown
-
本地音频:支持多种文件格式,可以使用 OpenAI 的 whisper 或 deepgram。支持自动去除静音等。注意:对于 whisper 无法处理的过大音频(通常>25MB),会自动分割成较小的文件,转录后合并。此外,音频转录本会转换为包含定期时间戳的文本,使得可以询问LLM某事是在何时说的。
-
本地视频:提取音频后将其作为本地音频处理
-
online_media: 使用 youtube_dl 尝试下载视频/音频,如果失败,则尝试使用 playwright 加载页面以拦截好的 URL 候选者。然后作为本地音频处理(但也适用于视频)。
-
epub:几乎未经测试,因为 epub 通常是一个定义不明确的格式
-
powerpoint: .ppt, .pptx, .odp, …
-
word: .doc, .docx, .odt, …
-
json_dict:包含单个 json 字典的文本文件。
-
递归类型
-
YouTube 播放列表:获取每个视频的链接然后进行处理
-
recursive_paths:将路径、正则表达式模式和文件类型转换为所有递归找到的文件,并按指定的文件类型处理(例如许多 PDF 文件或大量 HTML 文件等)。
-
link_file: 将包含 URL 的文本文件转换为适当的加载器参数。支持任何链接,例如网页、PDF 链接和 YouTube 链接可以放在同一个文件中。非常适合总结大量内容!
-
json_entries:将一个路径转换为文件,其中每行是一个 json 字典:包含在加载时使用的参数。例如:加载多个其他递归类型。一个示例可以在
docs/json_entries_example.json
中找到。 -
toml_entries: 读取一个 .toml 文件。示例可以在
docs/toml_entries_example.toml
中找到。
支持的任务
-
查询提供文档并对其提问。
-
仅返回文档及其元数据。对于 Anki,可以直接在浏览器中打开卡片。
-
总结提供文档并阅读摘要。摘要提示可在
utils/prompts.py
中找到。 -
总结后查询 首先总结文档,然后允许您直接查询它。
项目链接
https://github.com/thiswillbeyourgithub/wdoc
扫码加入技术交流群,备注「开发语言-城市-昵称」
(文:GitHubStore)