Doris RAG 代码速读与实现要点

📅 发布时间:2026/7/7 16:23:05 👁️ 浏览次数:
Doris RAG 代码速读与实现要点
本文基于仓库https://github.com/freemandealer/apache-doris-rag梳理 Apache Doris 在 RAG 流程中的核心实现与关键代码。覆盖向量入库、查询增强、检索、生成、服务端与 CLI以及知识图谱实验模块。整体架构配置 (conf.ini): Doris 连接、Embedding/LLM 选择、文档路径、界面语言。离线索引 (index_md_to_doris.py): 扫描 markdown → 清洗切分 → 生成向量 →doris_vector_search入库并建 HNSW 索引。检索与生成 (rag_lib.py): 基于查询向量检索 Doris拼上下文后调用 LLM 生成回答可选查询增强。服务层 (rag_service.py): FastAPI 提供/api/chat与简易 Web UI返回答案与引用源。CLI (rag_cli.py): 终端交互版。知识图谱实验 (build_knowledge_graph.py): 以向量搜索实体 SQL 取关系的混合方式在 Doris 中管理图数据。配置要点 (conf.ini.template)Doris 连接:host/query_port/http_port/user/password/db_name/table_name还包含图模式表名。Embedding:typeollama|openai模型名、base_url或api_key。LLM:typeopenai协议兼容模型/api_key/base_url/temperature。文档根目录:doc_root。应用语言:languagezh|en。离线索引文档入 Doris核心流程在index_md_to_doris.py:# 1) 收集与清洗文档filescollect_markdown_files(DOC_ROOT)cleanedclean_text(raw)# 去掉 frontmatter 并修剪行尾chunksRecursiveCharacterTextSplitter(chunk_size500,chunk_overlap100).split_text(cleaned)# 2) 构造记录{id:cur_id,path:rel_path,title:title,content:chunk,}# 3) 生成向量vectorsembeddings.embed_documents(texts)# 4) 写入 Doris 并建索引index_optionsIndexOptions(index_typehnsw,metric_typeinner_product)tableclient.create_table(table_name,df,index_optionsindex_options)要点使用doris_vector_search.DorisVectorClient若表存在则open_table().insert(df)。列包含id/path/title/content/embedding索引类型 HNSWmetric 为inner_product。检索与生成RAG 主链路rag_lib.pydefretrieve_context(query:str,top_k:int5)-pd.DataFrame:query_vecget_embedding_model().embed_query(query)tableDorisVectorClient(db,auth).open_table(table_name)returntable.search(query_vec).limit(top_k).select([id,path,title,content]).to_pandas()defquery_augment(query,historyNone):# 使用 LLM 做历史消歧/关键词补全提示词在 i18n 文本中promptget_message(...)returnget_llm().invoke(prompt).content.strip()Embedding 与 LLM 由配置决定默认 Ollama OpenAI 协议模型。检索结果以 DataFrame 返回供服务层拼接上下文。服务端FastAPI (rag_service.py)app.post(/api/chat)asyncdefchat(req:ChatRequest):augmented_queryquery_augment(req.query,req.history)context_dfretrieve_context(augmented_query,top_k5)context_text\n\n---\n\n.join([...])prompttemplate.format(history...,contextcontext_text,questionreq.query)answerget_llm().invoke(prompt).contentreturnChatResponse(answeranswer,sourcessources)在前端 HTML 中直接调用/api/chat展示答案与来源path/title。历史轮次作为 prompt 一部分UI 极简、无持久化。CLI (rag_cli.py)同样使用query_augment→retrieve_context→llm.invoke(prompt)。将检索到的上下文拼成提示词打印答案并把问答追加到历史。知识图谱实验 (build_knowledge_graph.py)使用异步 LLM (llm_adapters.get_async_chat_llm) 抽取实体/关系为三元组解析后构图。Doris 端建两张表graph_chunks(DUPLICATE KEY含向量索引INDEX idx_embedding (embedding) USING ANN ... dim1024)doc_status(UNIQUE KEY用于文档增量状态)入库实体/关系/子图分别作为 chunk文本生成向量后table.add()。检索search_entities用向量检索实体get_relations通过 SQL 查询相关边组合重建子图。国际化提示词 (i18n.py)language决定使用中/英提示词包括查询增强、对话模板、前端文案。快速试用假设已配置conf.ini且 Doris 就绪# 1) 安装依赖示例pipinstalldoris-vector-search0.0.5langchain langchain-community langchain-text-splitters langchain-openai fastapi uvicorn pydantic pandas# 2) 构建向量索引python index_md_to_doris.py# 3) 启动服务uvicorn rag_service:app --host0.0.0.0 --port8000访问http://localhost:8000体验 Web 端或运行python rag_cli.py在终端测试。实践建议在 Doris 侧预建数据库并为向量表配置足够的内存与并发资源。根据模型维度调整IndexOptions、dim及 metric必要时尝试混合检索向量 keyword 过滤。对大语料可增加批量写入与分片对 LLM 查询可加缓存或 streaming。知识图谱模式目前演示性质可按需完善删除、补全节点信息等逻辑。