llama index 研究

chunk_size = 1024
chunk_overlap = 200
默认1024长度 重叠200

文档类型推荐 chunk_sizeoverlap额外技巧
制度/规章(段落长、条款多)1 024–2 048200–400以“## 标题”为分隔符,保证条款完整
接口文档(URL/错误码表格)512–1 024100–200一级标题 + 二级标题拼一起,别把表格拦腰砍断
会议记录/周报(短片段)256–51250–100按“—-”或“## 周次”切,避免把多周拼一起
超长 RFC/设计文档2 048–4 096400先按“##”切,再对子章节二次切,做双层摘要索引

关键词

A whoosh+jieba 10万段 chunck 约2000篇

from llama_index.retrievers.whoosh import WhooshRetriever
from llama_index.core.query_engine import RetrieverQueryEngine

# 1. 复用已有的向量索引 docstore(保证 ID 对齐)
whoosh_retriever = WhooshRetriever(
    index_dir="./whoosh_idx",   # 倒排文件目录
    docs=vector_index.docstore.docs.values(),  # 传入同一批 doc
    top_k=5
)



# 3. 生成查询引擎
query_engine = RetrieverQueryEngine(fusion_retriever)

# 4. 交互
while True:
    q = input("\n问题:").strip()
    if q.lower() == "q":
        break
    resp = query_engine.query(q)
    print("答:", resp)

B aiosqlite+fts5 100万端 约 2万篇(10万篇以内)


from llama_index.core.query_engine import RetrieverQueryEngine
# 2. 可选:与向量做混合召回
from llama_index.core.retrievers import QueryFusionRetriever

fusion_retriever = QueryFusionRetriever(
    [vector_index.as_retriever(similarity_top_k=5),
     whoosh_retriever],
    retriever_weights=[0.6, 0.4],   # 谁更重要自己调
    similarity_top_k=5
)

# 3. 生成查询引擎
query_engine = RetrieverQueryEngine(fusion_retriever)

# 4. 交互
while True:
    q = input("\n问题:").strip()
    if q.lower() == "q":
        break
    resp = query_engine.query(q)
    print("答:", resp)

混合查询 关键词 +向量

pip install llama-index-core llama-index-llms-ollama llama-index-embeddings-ollama

# 关键词方案二选一
pip install llama-index-retrievers-whoosh     # 路线① Whoosh
# 或
pip install llama-index-retrievers-sqlite-ft  # 路线② SQLite-FTS5

代码

vector_index = VectorStoreIndex.from_documents(documents)
//向量
//PLAN A
from llama_index.retrievers.whoosh import WhooshRetriever

keyword_retriever = WhooshRetriever(
    index_dir="./whoosh_idx",
    docs=documents,
    top_k=5
)
//PLAN B
from llama_index.retrievers.sqlite_ft import SQLiteFTSRetriever

keyword_retriever = SQLiteFTSRetriever(
    db_path="gov_docs.db",
    docs=documents,
    top_k=5
)

//混合关键词 +向量
from llama_index.core.retrievers import QueryFusionRetriever

hybrid_retriever = QueryFusionRetriever(
    retrievers=[
        vector_index.as_retriever(similarity_top_k=5),
        keyword_retriever,
    ],
    retriever_weights=[0.7, 0.3],   # 向量权重高一点,可按场景调
    similarity_top_k=5,             # 最终只给 LLM 前 5 段
    num_queries=1,                  # 不对用户问题做改写
)

//查询
from llama_index.core.query_engine import RetrieverQueryEngine
//导入混合
query_engine = RetrieverQueryEngine(hybrid_retriever)

if __name__ == "__main__":
    print("=== 向量 + 关键词 联合召回 ===")
    while True:
        q = input("\n问题 (q退出): ").strip()
        if q.lower() == "q":
            break
        resp = query_engine.query(q)
        print("答:", resp)



SQLITE 补充 多次document插入

documents = []                       # 1. 先弄空列表
for _, afile, _ in bk:               # 2. 循环取路径
    if not os.path.isfile(afile):
        print(f'跳过不存在文件:{afile}')
        continue
    documents.extend(                # 3. 把每个文件拆出的文档追加进来
        SimpleDirectoryReader(afile).load_data()
    )

if not documents:                    # 4. 保险:确实读到东西了
    raise SystemExit('没有有效文档,无法构建索引!')

index = VectorStoreIndex.from_documents(documents)   # 5. 一次向量化

发表回复