Doramagic 项目包 · 项目说明书

quivr 项目

面向应用的生成式 AI 集成方案,封装好 RAG 流程,让你专注于产品本身。可灵活对接各种 LLM(GPT-4、Groq、Llama 等)、向量库(PGVector、Faiss 等)以及任意文件类型,并支持深度定制,轻松嵌入现有项目。

项目概览与快速上手

Quivr 是一个面向开发者的开源检索增强生成(RAG)框架,定位为「Quivr.com 的大脑」,其核心目标是把复杂的多文件解析、向量化、重排序、检索和工具调用封装成一个可嵌入到自有产品中的 Python 库。仓库根目录的 README.md 明确指出,框架强调「Your data, your control. Always.」,支持任意文件类型(PDF、TXT、Mark...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 典型使用形态

继续阅读本节完整说明和来源证据。

一、项目简介与定位

Quivr 是一个面向开发者的开源检索增强生成(RAG)框架,定位为「Quivr.com 的大脑」,其核心目标是把复杂的多文件解析、向量化、重排序、检索和工具调用封装成一个可嵌入到自有产品中的 Python 库。仓库根目录的 README.md 明确指出,框架强调「Your data, your control. Always.」,支持任意文件类型(PDF、TXT、Markdown 等),允许自定义 RAG 流程,并可通过 Megaparse 集成扩展解析能力。

框架的入口由 Brain 类提供,开发者在 5 行代码内即可完成「加载文件—创建知识库—问答」的全流程,参见 README.md 中的 Brain.from_files(...)brain.ask(...) 示例。该设计目标是让使用者「专注于产品本身,而把 RAG 实现交给 Quivr」。

典型使用形态

仓库自带多种示例,展示 Quivr 在不同场景下的能力边界:

示例目录场景关键依赖
examples/chatbot基于 Chainlit 的网页聊天机器人,支持上传 .txt 文件进行问答Chainlit、rye
examples/chatbot_voice同上,依赖锁定到 requirements.lockChainlit
examples/quivr-whisper借助 OpenAI Whisper 与 TTS,实现语音提问与语音播报Flask、OpenAI SDK
examples/simple_question极简脚本式问答入口仅 quivr-core

资料来源:README.mdexamples/chatbot/README.mdexamples/quivr-whisper/README.md

二、5 行代码快速上手

README.md 给出的「30 秒上手」包含两个步骤:先 pip install quivr-core,再用 Brain.from_files(...) 加载临时文件并调用 brain.ask(...)。其要点如下:

import tempfile
from quivr_core import Brain

with tempfile.NamedTemporaryFile(mode="w", suffix=".txt") as temp_file:
    temp_file.write("Gold is a liquid of blue-like colour.")
    temp_file.flush()

    brain = Brain.from_files(
        name="test_brain",
        file_paths=[temp_file.name],
    )

    answer = brain.ask("what is gold? answer in french")
    print("answer:", answer)

进阶用法则通过 YAML 工作流文件配置重排、检索与生成节点,例如 basic_rag_workflow.yaml 中定义了 START → filter_history → rewrite → retrieve → generate_rag → END 的有向图,并可指定 reranker_config.supplier(cohere / jina)、llm_config.max_input_tokenstemperature 等参数。运行时需在环境变量中提供相应 API Key(如 OPENAI_API_KEY),并支持 OpenAI、Anthropic、Mistral 以及通过 Ollama 接入的本地模型。

资料来源:README.mdcore/quivr_core/rag/quivr_rag_langgraph.py

三、核心架构与工作流

Quivr 的核心实现位于 core/quivr_core 目录,其 RAG 引擎基于 LangGraph 编排,主体类为 QuivrQARAGLangGraph(见 core/quivr_core/rag/quivr_rag_langgraph.py)。该类在初始化时接收 RetrievalConfigLLMEndpointVectorStore,并通过 get_reranker(...) 选择 Cohere、Jina 或默认的 IdempotentCompressor,通过 get_retriever(...) 装配检索器。其内部节点会先把用户输入拆分为多个独立任务,再为每个任务异步判断「是否需要工具补全」,最终路由到 run_toolgenerate_rag 节点。

flowchart LR
    A[START] --> B[filter_history]
    B --> C[rewrite]
    C --> D[retrieve]
    D --> E{工具补全?}
    E -- 是 --> F[run_tool]
    E -- 否 --> G[generate_rag]
    F --> G
    G --> H[END]

文档解析层位于 core/quivr_core/processor/implementations/default.py,通过工厂函数 _build_processor(...) 动态为每种扩展名生成处理器子类,覆盖 CSV、DOCX、EPUB、HTML、Markdown、ODT、PDF、PowerPoint、Python、Notebook、BibTeX 等格式;针对 PDF 还可以改用基于 Apache Tika 的 TikaProcessorcore/quivr_core/processor/implementations/tika_processor.py),通过 HTTP 调用 TIKA_SERVER_URL(默认 http://localhost:9998/tika)。

对话状态由 core/quivr_core/rag/entities/chat.py 中的 ChatHistory 类维护,使用 chat_idbrain_id(UUID)作为主键,内部以列表形式存放 ChatMessage,并提供 get_chat_history(newest_first=...) 等接口。响应模型则定义在 core/quivr_core/rag/entities/models.py,包括 RAGResponseMetadata(citations、followup_questions、sources、workflow_step、langchain_metadata 等)与流式版本 ParsedRAGChunkResponse.last_chunk

工具注册通过 core/quivr_core/llm_tools/llm_tools.py 中的 LLMToolFactory 统一暴露,所有可用工具汇聚在 TOOLS_CATEGORIESTOOLS_LISTS,包括:

提示词模板位于 core/quivr_core/rag/prompts.py,覆盖「将对话历史拆分为指令与任务」「选择工具路由」等关键环节,并通过 custom_prompts[TemplatePromptName.*] 进行按名检索。

四、扩展能力与社区关注点

Quivr 在设计上鼓励用户接入更多模型与数据源,但仍存在若干社区反复提及的痛点,值得在新项目评估时纳入考量:

  • 数据库可替换性Issue #484 指出希望支持自托管向量库(如 Milvus、ChromaDB),并提出在 Supabase 与本地库之间增加抽象层;Issue #618Issue #181 也质疑对 Supabase 的硬依赖与数据合规风险,Issue #612 进一步建议 README 明确 Supabase 的角色。
  • 多模型与多模态Issue #650 请求 Azure OpenAI 支持;Issue #3684 提出基于 Whisper 与视觉模型的多模态(音视频)摄取管线。core-0.0.32 已引入 o3-minirelease/core-0.0.32),说明模型接入层正在持续扩展。
  • 长对话上下文Issue #3135 讨论在多轮追问中保留线程上下文,并参考 mem0ai 等记忆方案;当前实现依赖 max_history(默认 10 轮)与 filter_history / rewrite 节点协同处理。
  • 项目活跃度Issue #3681 反映用户对自 2025 年中以来缺少提交的担忧,最新发布 core-0.0.33(2025-02-03,release/core-0.0.33)仅修复 CLI-24 并新增 Zendesk workflow;选型时需自行评估维护风险。
  • 部署兼容性Issue #2004 报告 Docker 环境下 Next.js 样式表因 CSP style-src 限制被拒绝加载,提示若自行部署前端需调整 style-src-elem 或反代策略。

See Also

资料来源:README.mdexamples/chatbot/README.mdexamples/quivr-whisper/README.md

核心架构:Brain、RAG 工作流与 LangGraph

Brain 是 Quivr-Core 对外暴露的核心类(在 [core/quivrcore/brain/init.py]() 中通过 from .brain import Brain 直接 re-export),封装了「文件加载 → 切分 → 嵌入 → 索引 → 检索 → 生成」的完整生命周期。它通过多个类方法覆盖不同来源的语料:

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 经典 LCEL 实现(QuivrQARAG)

继续阅读本节完整说明和来源证据。

章节 LangGraph 实现(QuivrQARAGLangGraph)

继续阅读本节完整说明和来源证据。

flowchart TB
    User[用户/调用方] -->|ask / ask_streaming| Brain[Brain 类]
    Brain -->|from_files / afrom_langchain_documents| Proc[Processor + VectorStore]
    Brain -->|asearch| VS[(Vector Store)]
    Brain -->|ask_streaming| RAG{选择 RAG 引擎}
    RAG -->|默认 / LCEL| QuivrQARAG[QuivrQARAG]
    RAG -->|YAML 工作流| QuivrQARAGLangGraph[QuivrQARAGLangGraph]
    QuivrQARAGLangGraph --> LG[LangGraph 图: rewrite → retrieve → rerank → generate]
    LG --> RR[Reranker: Cohere / Jina / Idempotent]
    QuivrQARAG --> Prompts[prompts.py 模板注册表]
    QuivrQARAG --> LF[Langfuse Callback]
    Brain --> CH[ChatHistory]
    Brain --> Info[BrainInfo / print_info]

Brain —— 知识库的顶层抽象

Brain 是 Quivr-Core 对外暴露的核心类(在 core/quivr_core/brain/__init__.py 中通过 from .brain import Brain 直接 re-export),封装了「文件加载 → 切分 → 嵌入 → 索引 → 检索 → 生成」的完整生命周期。它通过多个类方法覆盖不同来源的语料:

  • Brain.afrom_langchain_documents(name, langchain_documents, llm, embedder, vector_db):在 llmembedder 为空时回退到 default_llm() / default_embedder(),并通过 build_default_vectordb() 装配向量库;若调用方已传入 vector_db 则改为 aadd_documents() 增量写入。资料来源:core/quivr_core/brain/brain.py:afrom_langchain_documents
  • Brain.asearch(query, n_results=5, filter, fetch_n_neighbors=20):支持 str | Document 查询与 Callable | Dict 形式的元数据过滤,返回 SearchResult 列表。资料来源:core/quivr_core/brain/brain.py:asearch
  • Brain.ask() / ask_streaming():接收 RetrievalConfig,将问题路由到底层 RAG 引擎(默认走 LangGraph 实现)。
  • Brain.print_info():配合 LLMInfo 打印供应商、模型、温度、token 预算与向量库元数据,便于调试。资料来源:core/quivr_core/brain/brain.py:afrom_langchain_documents(示例)

多轮对话由 ChatHistorycore/quivr_core/rag/entities/chat.py)管理,按 chat_id + 可选 brain_id 维护有序消息流,并可被序列化为 LangChain 的 BaseMessage 列表传入 RAG 提示词。

RAG 工作流:QuivrQARAG 与 QuivrQARAGLangGraph

Quivr-Core 提供了两条等价的 RAG 执行路径,调用方在 RetrievalConfig 中切换:

经典 LCEL 实现(QuivrQARAG)

core/quivr_core/rag/quivr_rag.py 中的 QuivrQARAG.answer_astream() 采用 ChatPromptTemplate + chain.stream 模式:

  • 提示词来自 core/quivr_core/rag/prompts.pycustom_prompts 注册表(RAG_ANSWER_PROMPTCHAT_LLM_PROMPTDEFAULT_DOCUMENT_PROMPT 等),便于按租户/场景覆盖。资料来源:core/quivr_core/rag/prompts.py:custom_prompts
  • 通过 format_history_to_openai_mesages() 将历史转为 [SystemMessage, HumanMessage, AIMessage, ...]。资料来源:core/quivr_core/rag/utils.py:format_history_to_openai_mesages
  • 注入 Langfuse CallbackHandler 作为可观测性 hook,在 config={"metadata": ..., "callbacks": [langfuse_handler]} 中传递。资料来源:core/quivr_core/rag/quivr_rag.py:answer_astream
  • 流式分片根据 LLMEndpoint.supports_func_calling() 分支处理:支持函数调用时仅 yield 增量差分,不支持时 yield 滚动完整消息。资料来源:core/quivr_core/llm/llm_endpoint.py:supports_func_calling

LangGraph 实现(QuivrQARAGLangGraph)

core/quivr_core/rag/quivr_rag_langgraph.py 将工作流抽象为节点-边 DAG,由 basic_rag_workflow.yaml 描述(README 中给出了 START → filter_history → rewrite → ... → END 的最小骨架)。其关键方法:

  • get_reranker(supplier, model, top_n, api_key):按 RerankerConfig 选择 CohereRerankDefaultRerankers.COHERE)、JinaRerankDefaultRerankers.JINA)或默认的 IdempotentCompressor。资料来源:core/quivr_core/rag/quivr_rag_langgraph.py:get_reranker
  • get_retriever():将过滤条件、top-k 与 reranker 装配成 LangChain BaseRetriever
  • 由于 LangGraph 自带状态管理,社区正在讨论的「长会话记忆」改进(issue #3135 Improving user experience in long conversations)可借助 mem0 + LangGraph 集成直接挂到现有节点上。

LLM 端点、工具与文件处理器

LLMEndpointcore/quivr_core/llm/llm_endpoint.py)统一封装 OpenAI、AzureChatOpenAI、Anthropic、Mistral、Groq、Google Gemini 等供应商,并附带 LLMTokenizer —— 一个 LRU 缓存(默认 5 个 tokenizer / 50 MB),避免重复加载 HuggingFace 分词器。资料来源:core/quivr_core/llm/llm_endpoint.py:LLMTokenizer

工具层以 ToolRegistry 模式注册,例如 Web 检索:

  • WebSearchToolsList.TAVILY 通过 create_tavily_tool() 构造 TavilySearchResults,统一封装为 ToolWrapper(tool, format_input, format_output),输出可直接喂入向量库的 Document 列表。资料来源:core/quivr_core/llm_tools/web_search_tools.py:create_tavily_tool

文件侧,Processor 采用动态类生成策略:_build_processor(cls_name, load_cls, cls_extensions) 为每种扩展名(PDF、CSV、Markdown、EPUB、ODT、PPTX、IPynb、BibTeX …)生成 _Processor 子类,并共享 RecursiveCharacterTextSplitter + tiktoken cl100k_base 的默认切分。资料来源:core/quivr_core/processor/implementations/default.py:_build_processor 对 PDF 之外的复杂文档,可改用 core/quivr_core/processor/implementations/tika_processor.pyTikaProcessor,通过 TIKA_SERVER_URL 环境变量指向 Apache Tika 服务)。

常见问题与社区关切

  • 部署与 CSP:Docker 化运行曾因反向代理 style-src 'unsafe-inline' http://localhost:* 拦截 _next/static/css/* 导致样式失效(issue #2004),需在网关层补齐 style-src-elem
  • 多模态摄取:社区已提出基于 ffmpeg + Whisper + Vision 的多模态 RAG 提案(issue #3684),目前尚未合入主分支,仍需借助 examples/quivr-whisper/ 等外部示例实现音频问答。
  • 长期维护:因 2025 年中后期提交放缓,issue #3681 出现「项目是否被弃置」的讨论,core 包最近的版本是 core-0.0.33(2025-02-03),引入 zendesk workflow 与 tokenizers 缓存。
  • 自托管向量库:历史上 Supabase 的硬依赖引发多次讨论(#181、#484、#618),目前 Brain.afrom_langchain_documents() 已支持传入外部 vector_db,是自托管 PGVector / Chroma / Milvus 的推荐切入点。

See Also

来源:https://github.com/QuivrHQ/quivr / 项目说明书

文件处理、存储与 LLM 集成

Quivr(quivr-core)是一个面向 RAG(Retrieval-Augmented Generation,检索增强生成)的 Python 库,它把"文件如何解析—切片—嵌入存储—LLM 如何回答—如何调用工具"封装成一条统一管线。README 中对核心库的定位表述为:"Take care of the RAG so you can focus on your pr...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 默认处理器

继续阅读本节完整说明和来源证据。

章节 Tika 处理器

继续阅读本节完整说明和来源证据。

章节 工具工厂

继续阅读本节完整说明和来源证据。

概览

Quivr(quivr-core)是一个面向 RAG(Retrieval-Augmented Generation,检索增强生成)的 Python 库,它把"文件如何解析—切片—嵌入存储—LLM 如何回答—如何调用工具"封装成一条统一管线。README 中对核心库的定位表述为:"Take care of the RAG so you can focus on your product. Simply install quivr-core and add it to your project"。资料来源:README.md:1-50

本页面聚焦三个相互衔接的子系统:文件处理知识存储LLM 与工具集成,并介绍它们如何串联成一个可流式回答的端到端工作流。

文件处理管线

Quivr 使用基于 LangChain 文档加载器的可插拔 Processor 体系。ProcessorBase 是所有处理器的抽象基类,子类需要声明 supported_extensionsprocess_file_inner 等接口。资料来源:core/quivr_core/processor/processor_base.py:1-80

默认处理器

default.py 中的 _build_processor 函数动态生成专用处理器,每个处理器绑定一个 LangChain 加载器与一组文件扩展名。下表列出默认处理器与对应加载器:

扩展名LangChain Loader来源
.pdfUnstructuredPDFLoaderdefault.py
.docxDocx2txtLoaderdefault.py
.pptxUnstructuredPowerPointLoaderdefault.py
.xlsxUnstructuredExcelLoaderdefault.py
.txtTextLoaderdefault.py
.md/.mdx/.markdownUnstructuredMarkdownLoaderdefault.py
.htmlUnstructuredHTMLLoaderdefault.py
.csvCSVLoaderdefault.py
.epubUnstructuredEPubLoaderdefault.py
.odtUnstructuredODTLoaderdefault.py
.ipynbNotebookLoaderdefault.py
.pyPythonLoaderdefault.py
.bibBibtexLoaderdefault.py

所有处理器统一使用 RecursiveCharacterTextSplitter.from_tiktoken_encoder(基于 tiktoken cl100k_base 编码),切分参数来源于 SplitterConfigchunk_sizechunk_overlap)。资料来源:core/quivr_core/processor/implementations/default.py:1-120

Tika 处理器

对于复杂 PDF,TikaProcessor 调用外部 Apache Tika 服务完成文本提取。它通过 httpx.AsyncClient(默认超时 5 秒、最大重试 3 次)连接 TIKA_SERVER_URL(默认 http://localhost:9998/tika),可通过 docker run -d -p 9998:9998 apache/tika 启动该服务。资料来源:core/quivr_core/processor/implementations/tika_processor.py:1-60

知识存储:Brain 与向量库

Brain 类是 Quivr 中代表"一个知识集合"的核心对象。它支持通过 Brain.afrom_langchain_documents() 从 LangChain Document 列表异步构建:未指定 vector_db 时调用 build_default_vectordb(langchain_documents, embedder) 创建新向量库;指定时则使用 vector_db.aadd_documents(...) 把文档追加到现有库。asearch() 支持基于 query、过滤条件以及 fetch_n_neighbors(默认 20)的最近邻检索,返回 SearchResult 列表。资料来源:core/quivr_core/brain/brain.py:1-120

RetrievalConfig 把检索、LLM、重排序和工作流统一管理:k=40 控制检索返回的 chunk 数;max_files=20 控制参与 LLM 上下文的文件数;reranker_config 默认使用 IdempotentCompressor,可切换到 Cohere、Jina 等供应商;workflow_config 控制 LangGraph 节点编排。资料来源:core/quivr_core/rag/entities/config.py:1-80

ChatHistory 维护按时间排序的 list[ChatMessage],可在 get_chat_history(newest_first=...) 中切换顺序,源码中作者标注 "TODO: maybe use a deque() instead" 是未来潜在优化点。资料来源:core/quivr_core/rag/entities/chat.py:1-80

LLM 与工具集成

工具工厂

LLMToolFactory 通过 TOOLS_CATEGORIES 字典按类别查找工具;ToolsCategory 描述一个类别(名称、描述、工具列表、默认工具与构造回调),ToolWrapper 把 LangChain BaseToolformat_input / format_output 两个回调函数绑定,便于在 RAG 链中调用工具并把输出格式化为 LangChain DocumentToolRegistry 是一个简单的"名称 → 构造函

来源:https://github.com/QuivrHQ/quivr / 项目说明书

扩展性:自定义工具、解析器、工作流与示例

Quivr Core 的扩展性建立在四个明确的接缝(seam)之上:LLM 工具注册表、文件解析器抽象、RAG 工作流(基于 LangGraph)以及可独立运行的示例程序。README 中明确声明 "Quivr allows you to customize your RAG, add internet search, add tools, etc.",并强调 "you c...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 扩展一个工具的标准步骤

继续阅读本节完整说明和来源证据。

概述

Quivr Core 的扩展性建立在四个明确的接缝(seam)之上:LLM 工具注册表、文件解析器抽象、RAG 工作流(基于 LangGraph)以及可独立运行的示例程序。README 中明确声明 "Quivr allows you to customize your RAG, add internet search, add tools, etc.",并强调 "you can use it with PDF, TXT, Markdown, etc and even add your own parsers"(README.md)。下面按四个层次展开说明。

一、自定义 LLM 工具(Custom Tools)

工具层通过统一的注册表暴露给上层 RAG 使用。在 core/quivr_core/llm_tools/llm_tools.py 中,TOOLS_CATEGORIES 字典将每个 ToolsCategory(如 WebSearchToolsOtherTools)按类别名聚合,LLMToolFactory.create_tool 负责按工具名查找并返回包装后的 ToolWrapper,若传入的是类别名则使用该类别的 default_tool 作为回退。

注册与构造过程以 Tavily Web 搜索为例:core/quivr_core/llm_tools/web_search_tools.py 中定义了 WebSearchToolsList.TAVILY 枚举值,create_tavily_tool 返回一个带 format_input/format_output 适配器的 ToolWrapper,将搜索结果转换为 Document 对象列表,并填充 file_name/original_file_name 元数据。模块最后通过 web_search_tool_registry.register_tool(...) 注册,并组装成 ToolsCategory 实例供工厂调用。

扩展一个工具的标准步骤

  1. quivr_core/llm_tools/ 下新建模块,定义 XxxToolsList 枚举与 create_xxx_tool(config) 工厂;
  2. 实现 format_input(task)format_output(response) 两个适配函数;
  3. 创建 ToolRegistry 实例并调用 register_tool(...)
  4. 暴露一个 XxxTools = ToolsCategory(...),并在 llm_tools.pyTOOLS_CATEGORIESTOOLS_LISTS 中注册。

ToolWrapperToolsCategory 的契约定义在 core/quivr_core/llm_tools/entity.py 中,是新增工具必须遵循的接口边界。

二、自定义文件解析器(Custom Processors)

解析器层以 ProcessorBase 为基类,按文件扩展名匹配处理逻辑。在 core/quivr_core/processor/implementations/default.py 中,_build_processor(cls_name, load_cls, cls_extensions) 工厂使用 tiktoken.get_encoding("cl100k_base") 统计 token,并结合 RecursiveCharacterTextSplitter 切分文本。基于该工厂,模块为以下扩展名提供了开箱即用的处理器:

处理器加载器支持的扩展名
CSVProcessorCSVLoader.csv
DocxProcessorDocx2txtLoader.docx
ExcelProcessorUnstructuredExcelLoader.xlsx
PPTProcessorUnstructuredPowerPointLoader.pptx
MarkdownProcessorUnstructuredMarkdownLoader.md/.mdx/.markdown
EpubProcessor / BibTexProcessor / ODTProcessor / HTMLProcessor / PythonProcessor / NotebookProcessor / UnstructuredPDFProcessor对应 langchain 加载器各对应扩展名

对于 PDF 解析,core/quivr_core/processor/implementations/tika_processor.py 提供了替代实现 TikaProcessor,通过 httpx.AsyncClient 调用外部 Apache Tika 服务(默认 http://localhost:9998/tika),并支持 max_retriestimeout 调优参数。这覆盖了社区在 #484 中对更强解析能力的诉求。

新增解析器只需继承 ProcessorBase、声明 supported_extensions 列表,并在初始化时接入所需的 TextSplitterSplitterConfig,无需修改 RAG 主流程。

三、自定义工作流(LangGraph Workflows)

当默认的 QuivrQA 链路不够用时,可切换到 LangGraph 工作流。QuivrQARAGLangGraphcore/quivr_core/rag/quivr_rag_langgraph.py 中组织状态图:get_reranker 根据 RetrievalConfig.reranker_config 选择 CohereRerankJinaRerank 或兜底的 IdempotentCompressorgenerate_raggenerate_chat_llm 等节点方法把 AgentState 投影为 LLM 消息。Prompt 模板集中存放在 core/quivr_core/rag/prompts.py 中,例如 RAG_ANSWER_PROMPTCHAT_LLM_PROMPTDEFAULT_DOCUMENT_PROMPT,开发者可通过 custom_prompts[TemplatePromptName.X] = ... 进行覆盖。

相比之下,默认的同步/流式链路见 core/quivr_core/rag/quivr_rag.py:answer() 使用 conversational_qa_chain.invoke(...)answer_astream()supports_func_calling() 为真时通过 llm.bind_tools([cited_answer], tool_choice="any") 触发结构化引用输出,并以 ParsedRAGChunkResponse 流式产出增量文本与元数据(core/quivr_core/rag/entities/models.py)。

flowchart LR
    A[用户问题] --> B[build_chain]
    B --> C[loaded_memory]
    C --> D[standalone_question]
    D --> E[retrieved_documents]
    E --> F[RAG_ANSWER_PROMPT]
    F --> G{supports_func_calling?}
    G -- 是 --> H[bind_tools cited_answer]
    G -- 否 --> I[普通 LLM 调用]
    H --> J[ParsedRAGChunkResponse 流]
    I --> J

四、示例项目(Examples)

仓库根目录下 examples/ 提供了三条可直接运行的脚手架:

这些示例都通过 Brain 类与向量库交互(core/quivr_core/brain/brain.py),并使用 Brain.afrom_langchain_documentsasearch 等异步 API 完成文档入库与检索。

五、常见失败模式与注意事项

  • 工具未注册:在 LLMToolFactory.create_tool 中遇到未知名会抛出 ValueError("Tool {tool_name} is not supported."),需同时在 TOOLS_CATEGORIESTOOLS_LISTS 中登记。
  • 解析器未覆盖扩展名ProcessorRegistry 会跳过未知扩展名,需为新格式新增 _build_processor(...) 或自定义 ProcessorBase 子类。
  • Tika 服务不可达TikaProcessor 默认连接 http://localhost:9998/tika,需先用 docker run -d -p 9998:9998 apache/tika 启动,否则 httpx.AsyncClient 将超时。
  • 流式引用为空:当 LLM 不支持 function calling 时,answer_astream 不会发出 citations 元数据,应改用 LangGraph 工作流并显式解析。
  • 社区对项目活跃度的关切:见 issue #3681,建议在生产环境锁定 core 的具体小版本(如 core: v0.0.33)。

See Also

来源:https://github.com/QuivrHQ/quivr / 项目说明书

失败模式与踩坑日记

保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。

high 来源证据:[Feature]: Multi-Modal RAG (Video/Audio Ingestion via Whisper & Vision Models)

可能增加新用户试用和生产接入成本。

high 来源证据:EU AI Act Compliance Scan Results — Sharing Findings for Feedback

可能影响授权、密钥配置或安全边界。

high 来源证据:[Bug]:

可能增加新用户试用和生产接入成本。

medium 能力判断依赖假设

假设不成立时,用户拿不到承诺的能力。

Pitfall Log / 踩坑日志

项目:QuivrHQ/quivr

摘要:发现 10 个潜在踩坑项,其中 3 个为 high/blocking;最高优先级:安装坑 - 来源证据:[Feature]: Multi-Modal RAG (Video/Audio Ingestion via Whisper & Vision Models)。

1. 安装坑 · 来源证据:[Feature]: Multi-Modal RAG (Video/Audio Ingestion via Whisper & Vision Models)

  • 严重度:high
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:[Feature]: Multi-Modal RAG (Video/Audio Ingestion via Whisper & Vision Models)
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 证据:community_evidence:github | https://github.com/QuivrHQ/quivr/issues/3684 | 来源类型 github_issue 暴露的待验证使用条件。

2. 安全/权限坑 · 来源证据:EU AI Act Compliance Scan Results — Sharing Findings for Feedback

  • 严重度:high
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:EU AI Act Compliance Scan Results — Sharing Findings for Feedback
  • 对用户的影响:可能影响授权、密钥配置或安全边界。
  • 证据:community_evidence:github | https://github.com/QuivrHQ/quivr/issues/3667 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

3. 安全/权限坑 · 来源证据:[Bug]:

  • 严重度:high
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:[Bug]:
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 证据:community_evidence:github | https://github.com/QuivrHQ/quivr/issues/2004 | 来源讨论提到 docker 相关条件,需在安装/试用前复核。

4. 能力坑 · 能力判断依赖假设

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:README/documentation is current enough for a first validation pass.
  • 对用户的影响:假设不成立时,用户拿不到承诺的能力。
  • 证据:capability.assumptions | https://github.com/QuivrHQ/quivr | README/documentation is current enough for a first validation pass.

5. 运行坑 · 来源证据:[Bug]:

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个运行相关的待验证问题:[Bug]:
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 证据:community_evidence:github | https://github.com/QuivrHQ/quivr/issues/3686 | 来源类型 github_issue 暴露的待验证使用条件。

6. 维护坑 · 维护活跃度未知

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:未记录 last_activity_observed。
  • 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
  • 证据:evidence.maintainer_signals | https://github.com/QuivrHQ/quivr | last_activity_observed missing
  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 证据:downstream_validation.risk_items | https://github.com/QuivrHQ/quivr | no_demo; severity=medium

8. 安全/权限坑 · 存在评分风险

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 对用户的影响:风险会影响是否适合普通用户安装。
  • 证据:risks.scoring_risks | https://github.com/QuivrHQ/quivr | no_demo; severity=medium

9. 维护坑 · issue/PR 响应质量未知

  • 严重度:low
  • 证据强度:source_linked
  • 发现:issue_or_pr_quality=unknown。
  • 对用户的影响:用户无法判断遇到问题后是否有人维护。
  • 证据:evidence.maintainer_signals | https://github.com/QuivrHQ/quivr | issue_or_pr_quality=unknown

10. 维护坑 · 发布节奏不明确

  • 严重度:low
  • 证据强度:source_linked
  • 发现:release_recency=unknown。
  • 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
  • 证据:evidence.maintainer_signals | https://github.com/QuivrHQ/quivr | release_recency=unknown

来源:Doramagic 发现、验证与编译记录