跳转至

Query A KnowledgeBase

KnowledgeBase 是 Heta 的统一查询入口。你不需要记住每个底层 store 的查询 API,只需要选择一个当前 KB 已经支持的 query mode。

flowchart LR
    Request[QueryRequest] --> KB[KnowledgeBase.query]
    KB --> Engine[Query engine]
    Engine --> Assets[Search assets]
    Assets --> Response[QueryResponse]

Check What The KB Can Query

每个 query mode 都来自 build steps。构建完成后,先看当前 KB 支持什么:

print(sorted(kb.available_queries))

常见结果:

['vector_search']
['full_text_search', 'vector_search']
['heta_graph_search', 'hybrid_search', 'heta_rerank_search', 'vector_search']

如果调用了当前 KB 没有构建过的 mode,Heta 会明确报错,而不是返回一个看似正常但实际不可靠的结果。

Query Input

所有内置 query mode 都走同一个入口:

response = await kb.query(
    "How does Heta build a knowledge base?",
    mode="vector_search",
    top_k=5,
    filters={},
    options={"generate_answer": True},
    trace=False,
)
参数 说明
text 用户问题或检索文本。
mode 查询方式,例如 vector_searchfull_text_searchheta_graph_search
top_k 返回多少条结果。
filters 传给底层 store 的过滤条件。不同 store 支持的字段可能不同。
options query engine 的可选行为,例如是否生成 answer、融合权重、最大多跳轮数。
trace 是否返回结构化 trace,方便调试。

Query Output

kb.query(...) 返回 QueryResponse

字段 说明
mode 实际使用的 query mode。
answer 可选答案。只有开启答案生成并且有可用 LanguageModel 时才会返回。
results 检索结果列表。每条结果包含 idtextscorekindsourcemetadata
citations 从结果中整理出的引用和来源信息。
trace 可选调试事件。只有 trace=True 时返回。
metadata query engine 的补充信息,例如使用的 collection、index、融合参数或 issues。

最常用的是:

print(response.answer)
for result in response.results:
    print(result.score, result.text, result.source)

Choose A Query Mode

先按问题类型选择 mode。不要为了“更强”默认使用最复杂模式;复杂模式依赖更多资产和模型,也会增加延迟和成本。

Mode 什么时候用 不适合
vector_search 用户问题是自然语言,想找语义相近 chunk。 精确编号、短代码、固定术语为主的查询。
full_text_search 查询包含明确关键词、编号、术语、条款、函数名。 同义表达很多、关键词不稳定的查询。
sql_text_search 已经用 PersistChunks 把 chunk 写入 SQL,并希望用 SQL 做文本匹配或证据查询。 需要 BM25-style 排序的全文检索。
heta_graph_search 需要实体、关系、证据溯源。 只需要简单语义 chunk 的问题。
hybrid_search 同时需要向量召回和图谱召回,用 RRF 融合结果。 没有构建 graph assets 的 KB。
heta_rerank_search 想把向量、图谱、全文结果融合,并可选使用 reranker 提升排序。 不想引入额外模型成本或延迟的简单查询。
heta_rewrite_search 用户问题表述模糊,可能需要生成多个查询变体。 关键词非常明确、一次检索就足够的问题。
heta_multihop_search 一个问题需要多轮检索、信息累积和保守作答。 单跳 fact lookup 或低延迟查询。

Required Assets

每个 mode 都依赖 build steps 产生的 search assets。

Mode 主要资产 通常由哪个 step 产生
vector_search chunk_vector_index IndexVectors
full_text_search chunk_full_text_index IndexFullText
sql_text_search chunk_text_index PersistChunks
heta_graph_search graph_tablesgraph_vector_index BuildGraphMergeGraphIntoStore
hybrid_search chunk_vector_indexgraph_tablesgraph_vector_index IndexVectors + graph steps
heta_rerank_search vector + graph + full-text assets vector + graph + IndexFullText
heta_rewrite_search models.language + base search assets 通常复用 heta_rerank_search 的资产
heta_multihop_search models.language + base search assets 通常复用 heta_rerank_search 的资产
flowchart LR
    IndexVectors[IndexVectors] --> VectorAsset[chunk_vector_index]
    VectorAsset --> VectorSearch[vector_search]

    IndexFullText[IndexFullText] --> TextAsset[chunk_full_text_index]
    TextAsset --> FullTextSearch[full_text_search]

    BuildGraph[BuildGraph] --> GraphTables[graph_tables]
    BuildGraph --> GraphVectors[graph_vector_index]
    GraphTables --> GraphSearch[heta_graph_search]
    GraphVectors --> GraphSearch

    VectorSearch --> Hybrid[hybrid_search]
    GraphSearch --> Hybrid
    FullTextSearch --> Rerank[heta_rerank_search]
    Hybrid --> Rerank
    Rerank --> Rewrite[heta_rewrite_search]
    Rerank --> Multihop[heta_multihop_search]

Answer Generation

检索和答案生成是分开的。默认 query 可以只返回 evidence;需要答案时,在 options 中开启:

response = await kb.query(
    "What does this document say about Heta recipes?",
    mode="vector_search",
    top_k=3,
    options={"generate_answer": True},
)

答案生成由对应 query engine 自己处理。比如 graph search 会用 graph evidence 组织 prompt,full-text search 会用关键词命中的 chunk 组织 prompt。

如果没有配置 KnowledgeModels.language,检索仍然可以返回 results,但不会生成 answer

Trace And Issues

调试检索时可以打开 trace:

response = await kb.query(
    "How does the graph search work?",
    mode="heta_graph_search",
    top_k=5,
    trace=True,
)

for event in response.trace:
    print(event.stage, event.message, event.metadata)

一些可恢复问题会进入 response.metadata["issues"],例如 query rewrite 失败后退回基础检索,或 multihop 达到最大轮数后生成保守答案。

Good Defaults

实际使用时可以按这个顺序选:

  1. 先用 vector_search 验证最小 KB。
  2. 关键词强的业务,加入 full_text_search
  3. 需要实体关系和证据溯源,加入 heta_graph_search
  4. 需要综合召回,使用 hybrid_searchheta_rerank_search
  5. 问题表述不稳定,用 heta_rewrite_search
  6. 多跳问题,用 heta_multihop_search

Next