news 2026/5/1 5:59:53

Doris RAG 代码速读与实现要点

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Doris RAG 代码速读与实现要点

本文基于仓库https://github.com/freemandealer/apache-doris-rag,梳理 Apache Doris 在 RAG 流程中的核心实现与关键代码。覆盖向量入库、查询增强、检索、生成、服务端与 CLI,以及知识图谱实验模块。

整体架构

  1. 配置 (conf.ini): Doris 连接、Embedding/LLM 选择、文档路径、界面语言。
  2. 离线索引 (index_md_to_doris.py): 扫描 markdown → 清洗切分 → 生成向量 →doris_vector_search入库并建 HNSW 索引。
  3. 检索与生成 (rag_lib.py): 基于查询向量检索 Doris,拼上下文后调用 LLM 生成回答,可选查询增强。
  4. 服务层 (rag_service.py): FastAPI 提供/api/chat与简易 Web UI,返回答案与引用源。
  5. CLI (rag_cli.py): 终端交互版。
  6. 知识图谱实验 (build_knowledge_graph.py): 以向量搜索实体 + SQL 取关系的混合方式在 Doris 中管理图数据。

配置要点 (conf.ini.template)

  • Doris 连接:host/query_port/http_port/user/password/db_name/table_name,还包含图模式表名。
  • Embedding:type=ollama|openai,模型名、base_urlapi_key
  • LLM:type=openai协议兼容,模型/api_key/base_url/temperature
  • 文档根目录:doc_root
  • 应用语言:language=zh|en

离线索引:文档入 Doris

核心流程在index_md_to_doris.py:

# 1) 收集与清洗文档files=collect_markdown_files(DOC_ROOT)cleaned=clean_text(raw)# 去掉 frontmatter 并修剪行尾chunks=RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=100).split_text(cleaned)# 2) 构造记录{"id":cur_id,"path":rel_path,"title":title,"content":chunk,}# 3) 生成向量vectors=embeddings.embed_documents(texts)# 4) 写入 Doris 并建索引index_options=IndexOptions(index_type="hnsw",metric_type="inner_product")table=client.create_table(table_name,df,index_options=index_options)

要点:

  • 使用doris_vector_search.DorisVectorClient;若表存在则open_table().insert(df)
  • 列包含id/path/title/content/embedding,索引类型 HNSW,metric 为inner_product

检索与生成:RAG 主链路

rag_lib.py

defretrieve_context(query:str,top_k:int=5)->pd.DataFrame:query_vec=get_embedding_model().embed_query(query)table=DorisVectorClient(db,auth).open_table(table_name)returntable.search(query_vec).limit(top_k).select(["id","path","title","content"]).to_pandas()defquery_augment(query,history=None):# 使用 LLM 做历史消歧/关键词补全,提示词在 i18n 文本中prompt=get_message(...)returnget_llm().invoke(prompt).content.strip()
  • Embedding 与 LLM 由配置决定,默认 Ollama + OpenAI 协议模型。
  • 检索结果以 DataFrame 返回,供服务层拼接上下文。

服务端:FastAPI (rag_service.py)

@app.post("/api/chat")asyncdefchat(req:ChatRequest):augmented_query=query_augment(req.query,req.history)context_df=retrieve_context(augmented_query,top_k=5)context_text="\n\n---\n\n".join([...])prompt=template.format(history=...,context=context_text,question=req.query)answer=get_llm().invoke(prompt).contentreturnChatResponse(answer=answer,sources=sources)
  • 在前端 HTML 中直接调用/api/chat,展示答案与来源path/title
  • 历史轮次作为 prompt 一部分;UI 极简、无持久化。

CLI (rag_cli.py)

  • 同样使用query_augmentretrieve_contextllm.invoke(prompt)
  • 将检索到的上下文拼成提示词,打印答案并把问答追加到历史。

知识图谱实验 (build_knowledge_graph.py)

  • 使用异步 LLM (llm_adapters.get_async_chat_llm) 抽取实体/关系为三元组,解析后构图。
  • Doris 端建两张表:
    • graph_chunks(DUPLICATE KEY,含向量索引INDEX idx_embedding (embedding) USING ANN ... dim=1024)
    • doc_status(UNIQUE KEY,用于文档增量状态)
  • 入库:实体/关系/子图分别作为 chunk,文本生成向量后table.add()
  • 检索:search_entities用向量检索实体;get_relations通过 SQL 查询相关边;组合重建子图。

国际化提示词 (i18n.py)

  • language决定使用中/英提示词,包括查询增强、对话模板、前端文案。

快速试用(假设已配置conf.ini且 Doris 就绪)

# 1) 安装依赖(示例)pipinstall"doris-vector-search>=0.0.5"langchain 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 侧预建数据库,并为向量表配置足够的内存与并发资源。
  • 根据模型维度调整IndexOptionsdim及 metric;必要时尝试混合检索(向量 + keyword 过滤)。
  • 对大语料可增加批量写入与分片;对 LLM 查询可加缓存或 streaming。
  • 知识图谱模式目前演示性质,可按需完善删除、补全节点信息等逻辑。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 4:46:16

导师又让重写?10个AI论文网站测评:本科生毕业论文写作神器推荐

在当前学术写作日益依赖技术工具的背景下,本科生群体面临着选题困难、文献整理繁琐、格式规范不熟悉等多重挑战。如何高效完成一篇高质量的毕业论文,已成为许多学生关注的焦点。为此,我们基于2026年的实测数据与真实用户反馈,对市…

作者头像 李华
网站建设 2026/5/1 4:48:26

Excel乘积大师PRODUCT函数:超越基础计算的逻辑判断利器

你以为PRODUCT函数只能算乘法?它的自动容错和逻辑乘积特性,能让复杂的数据判定变得异常简洁! 在Excel中,乘法运算是日常计算中最常见的操作之一。很多人习惯使用星号 * 进行乘法,但当遇到包含文本、错误值的复杂数据时…

作者头像 李华
网站建设 2026/5/1 4:48:20

HighGo Database企业版忘记密码处理方法

[toc]# 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7,Microsoft Windows (64-bit) 2012 R2,Microsoft Windows (64-bit) 2012 版本:4.1.1 症状 企业版数据库忘记密码无法登陆数据库。 解决方案 重设密码步骤如下: 1.找到忘记密码的…

作者头像 李华
网站建设 2026/4/25 21:46:52

‌自动化工具教学:Udemy课程制作与推广

一、目标用户洞察:软件测试从业者的核心学习痛点‌ 软件测试从业者在学习自动化工具时,面临的是‌高门槛、高维护成本、低回报感‌的三重困境: ‌脚本脆弱性‌:Selenium脚本因页面元素动态变化、异步加载、网络延迟频繁失效&…

作者头像 李华
网站建设 2026/5/1 5:40:59

微信小程序Python-uniapp 零工市场服务系统

目录微信小程序与Python-Uniapp结合的零工市场服务系统开发技术路线结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!微信小程序与Python-Uniapp结合的零工市场服务系统 技术栈选择 采用微信小程序作为前端入口,Uniapp框架…

作者头像 李华