实战指南:基于 Apache Doris 构建企业级 RAG(检索增强生成)应用 📅 发布时间:2026/7/5 1:17:49 👁️ 浏览次数: 1. 引言在 LLM大语言模型应用爆发的今天RAGRetrieval-Augmented Generation检索增强生成已成为解决大模型“幻觉”和知识滞后问题的标准方案。而作为 RAG 核心组件的向量数据库其性能直接决定了检索的效率。GitHub 上的开源项目 [apache-doris-rag]提供了一个非常优秀的范例展示了如何利用Apache Doris强大的向量检索能力来构建 RAG 系统。为什么选择 Apache Doris 做 RAG极速性能基于 C 实现的 HNSW 索引查询速度极快。混合检索支持向量检索 标量筛选如WHERE categoryfinance AND vector_distance(...) 0.5这是传统专用向量数据库的弱项却是 Doris 的强项。架构统一无需维护单独的 Vector DB数仓和向量库合二为一降低运维成本。本文将深入解析该项目的核心实现带您从零构建一个基于 Apache Doris 的 RAG 系统。2. 架构设计在基于 Apache Doris 的 RAG 系统中数据流转主要分为两个阶段知识入库Indexing和问答检索Retrieval Generation。3. 环境准备在开始代码之前我们需要准备基础环境。3.1 软件依赖Apache Doris: 建议 2.0 及以上版本2.1 对向量索引支持更完善。Python: 3.8Python 库:pymysql(连接 Doris),langchain,openai(或sentence-transformers),pandas.3.2 启动 Apache Doris (Docker 快速启动)如果您还没有 Doris 环境可以使用 Docker 快速拉取一个单机版用于测试# 下载 Docker 镜像dockerpull apache/doris:2.1.0-bin-x64# 启动 (需根据官方文档配置 FE/BE 端口)# 这里假设您已经有可用的 Doris 实例IP 为 127.0.0.1FE Query Port 为 90304. 数据库设计 (Doris 端)这是最关键的一步。我们需要在 Doris 中创建一个支持向量索引的表。4.1 创建向量表登录 MySQL 客户端或 DBeaver 连接 Doris执行以下 SQLCREATEDATABASEIFNOTEXISTSrag_demo;USErag_demo;CREATETABLEIFNOTEXISTSdocuments(idVARCHAR(64)NOTNULLCOMMENT文档ID,contentTEXTCOMMENT原始文本内容,metadataTEXTCOMMENT元数据(JSON格式),vector_col ARRAYFLOATNOTNULLCOMMENT向量数据,INDEXidx_vector(vector_col)USINGHNSW PROPERTIES(dim1536,-- 对应 OpenAI embedding 维度metric_typecosine_similarity,-- 余弦相似度m16,-- HNSW 参数ef_construction200-- HNSW 参数))ENGINEOLAPDUPLICATEKEY(id)DISTRIBUTEDBYHASH(id)BUCKETS1PROPERTIES(replication_num1,enable_light_schema_changetrue);注意dim参数必须与你选用的 Embedding 模型维度一致。OpenAItext-embedding-3-small通常是 1536 维。5. 代码实现 (Python 端)参考apache-doris-rag的逻辑我们将代码分为数据导入和问答检索两部分。5.1 导入数据 (Ingestion)这段代码负责读取文件、切分文本、计算向量并存入 Doris。importosimportuuidimportjsonimportpandasaspdfromlangchain.document_loadersimportTextLoader,PyPDFLoaderfromlangchain.text_splitterimportRecursiveCharacterTextSplitterfromlangchain_openaiimportOpenAIEmbeddingsimportpymysql# 1. 配置信息DORIS_HOST127.0.0.1DORIS_PORT9030DORIS_USERrootDORIS_PASSWORDDORIS_DBrag_demo# 初始化 Embedding 模型os.environ[OPENAI_API_KEY]sk-xxxx...# 替换你的 KeyembeddingsOpenAIEmbeddings(modeltext-embedding-3-small)defget_doris_connection():returnpymysql.connect(hostDORIS_HOST,portDORIS_PORT,userDORIS_USER,passwordDORIS_PASSWORD,databaseDORIS_DB,charsetutf8mb4)defingest_docs(file_path):# 2. 加载与切分文档print(f正在加载文件:{file_path}...)loaderTextLoader(file_path,encodingutf-8)# 或者是 PyPDFLoaderdocumentsloader.load()text_splitterRecursiveCharacterTextSplitter(chunk_size500,chunk_overlap50)chunkstext_splitter.split_documents(documents)print(f文档已切分为{len(chunks)}个片段正在生成向量...)# 3. 批量生成向量并写入 Dorisconnget_doris_connection()cursorconn.cursor()batch_data[]forchunkinchunks:# 生成向量vectorembeddings.embed_query(chunk.page_content)# 准备 SQL 插入数据# Doris 接收数组格式字符串: [0.1, 0.2, ...]vector_strstr(vector)doc_idstr(uuid.uuid4())metadatajson.dumps(chunk.metadata)# 简单处理单引号转义contentchunk.page_content.replace(,\\)sqlf INSERT INTO documents (id, content, metadata, vector_col) VALUES ({doc_id}, {content}, {metadata},{vector_str}) try:cursor.execute(sql)exceptExceptionase:print(fInsert error:{e})conn.commit()conn.close()print(数据入库完成)# 运行导入if__name____main__:# 创建一个测试文件withopen(test_knowledge.txt,w,encodingutf-8)asf:f.write(Apache Doris 是一个现代化的 MPP 分析型数据库产品。它支持极速的实时数据分析。)ingest_docs(test_knowledge.txt)5.2 检索与问答 (RAG)这里我们利用 SQL 进行向量检索然后调用 LLM 回答。fromlangchain_openaiimportChatOpenAI# 初始化 LLMllmChatOpenAI(modelgpt-3.5-turbo,temperature0)defsearch_doris(query_text,top_k3):在 Doris 中进行向量搜索# 1. 将用户问题转为向量query_vectorembeddings.embed_query(query_text)vector_strstr(query_vector)connget_doris_connection()cursorconn.cursor()# 2. 执行向量检索 SQL# 使用 cosine_distance 函数结果越接近 0 越相似 (Doris 2.1 语法可能略有不同以官方文档为准)# 若 metric_type 定义为 cosine_similarity这里通常查出来的是距离排序需注意sqlf SELECT content, cosine_distance(vector_col,{vector_str}) as dist FROM documents ORDER BY dist ASC LIMIT{top_k}cursor.execute(sql)resultscursor.fetchall()conn.close()# 返回纯文本列表return[row[0]forrowinresults]defrag_chat(query):# 1. 检索上下文print(f用户提问:{query})print(正在检索 Doris...)retrieved_docssearch_doris(query)context\n\n.join(retrieved_docs)print(f检索到{len(retrieved_docs)}条相关上下文。)# 2. 构建 Promptpromptf 基于以下已知信息简洁和专业地回答用户的问题。如果无法从信息中得到答案请说我不知道。 已知信息:{context}问题:{query}# 3. LLM 生成print(正在思考...)responsellm.invoke(prompt)returnresponse.content# 运行测试if__name____main__:answerrag_chat(Apache Doris 的特点是什么)print(-*30)print(fAI 回答: \n{answer})6. 实现细节深度解析在apache-doris-rag及类似的实现中有几个核心点值得注意6.1 向量索引的选择Doris 提供了HNSW索引。在CREATE TABLE语句中我们设置了ef_construction和m。m: 节点在图中的最大连接数。值越大索引质量越高但内存占用和构建时间增加。ef_construction: 构建索引时的搜索范围。值越大索引质量越高构建越慢。PROPERTIES: 对于生产环境务必根据数据量调整这些参数。6.2 混合查询 (Hybrid Search)Doris 的一大杀手锏是可以在 SQL 中直接混合标量过滤。例如我们只想在“2023年之后”的文档中搜索# 代码片段演示sqlf SELECT content, cosine_distance(vector_col,{vector_str}) as dist FROM documents WHERE metadata LIKE %year: 2024% -- 混合过滤 ORDER BY dist ASC LIMIT 3 这种能力使得 Doris 在处理带有复杂业务逻辑的 RAG 场景如多租户隔离、权限控制时比纯向量数据库如 Milvus, Chroma更具优势。6.3 性能优化Stream Load: 在 Python 代码中我们使用了INSERT这适合小批量数据。如果是海量数据导入建议使用 Doris 的Stream LoadHTTP 接口吞吐量更高。分区 (Partitioning): 如果数据量达到亿级建议按时间或业务ID对表进行PARTITION BY进一步提升查询效率。7. 总结通过参考apache-doris-rag的实现思路我们发现基于 Apache Doris 构建 RAG 系统非常直观。它不需要引入复杂的新的向量数据库组件仅仅利用现有的数仓设施就能实现SQL Vector的强大检索能力。核心优势总结架构极简ETL 处理完的数据直接生成向量存入 Doris数据不搬家。查询灵活标准 SQL 接口运维人员零门槛上手。高并发Doris 原生的 MPP 架构能够支撑高并发的 RAG 请求。参考资料:Apache Doris 官方文档: Vector SearchGitHub 项目: GeiTe168/apache-doris-rag
计算机专业开题报告模板:基于系统设计的软件工程写作结构解析 写在前面:这篇文章适合谁,看完能解决什么问题 这篇文章主要写给正在准备计算机专业毕业论文、选题方向为系统设计类课题的学生。 如果你已经确定了做管理系统、业务系统、信息系统,但在撰写论文开题报告时,不清楚结构怎么搭、内容… 2026/7/4 23:43:17
AutoGen 多智能体“辩论式写代码”:让几个 AI 先吵一架再给我最终方案,实测效果如何? 摘要:在传统的 AI 代码生成场景中,单个大模型往往存在"一次性输出、缺少迭代优化"的局限性。本文通过 AutoGen 框架构建了一个多智能体协作系统,让多个 AI Agent 以"辩论式"方式对代码方案进行质疑、改进和验证。我们实测对比了单 Agent 直接生成与多 A… 2026/5/17 2:26:04
建议收藏|AI论文工具,千笔·专业论文写作工具 VS speedai,专科生专属利器! 随着人工智能技术的迅猛发展,AI辅助写作工具已逐渐成为高校学生完成毕业论文的重要帮手。无论是开题报告、文献综述还是整篇论文的撰写,越来越多的学生开始借助这些工具提升效率、降低写作难度。然而,面对市场上种类繁多、功能各异的AI写作平… 2026/5/17 2:26:01
Allegro PCB设计环境搭建与高速布线实战指南 1. Allegro PCB设计环境搭建与基础配置 1.1 软件安装与授权配置 Cadence Allegro作为业界领先的PCB设计工具,其安装过程需要特别注意版本兼容性。以Allegro 17.4版本为例,安装前需确保系统满足以下要求: 操作系统:Windows 10 64… 2026/7/5 12:58:00
西门子S7-1200 PLC控制3轴伺服系统实战指南 1. 西门子S7-1200 PLC控制3轴伺服系统概述在工业自动化领域,西门子S7-1200系列PLC因其出色的性价比和稳定的性能,成为中小型自动化项目的首选控制器。我最近完成了一个使用S7-1200 PLC通过PTO(脉冲串输出)方式控制3轴伺服系统的项… 2026/7/5 12:56:00
BLDC300W24V 驱动器 PID 调参:麦轮小车 4 电机同步与遥控响应优化 BLDC300W24V 驱动器 PID 调参:麦轮小车 4 电机同步与遥控响应优化1. 多电机协同控制的核心挑战麦轮小车的运动控制本质上是一个多自由度系统解耦问题。当四个无刷电机需要同时响应遥控指令时,任何单个电机的响应延迟或速度偏差都会导致整车运动轨迹偏离预… 2026/7/5 12:56:00
西门子Smart200与V90伺服三轴控制系统实战指南 1. 西门子Smart200与V90伺服三轴控制系统概述 这套由西门子Smart200 PLC和V90伺服驱动器组成的三轴控制系统,在工业自动化领域堪称中小型项目的黄金搭档。Smart200作为西门子经典的小型PLC,自带Profinet接口的特性让它与支持PN通讯的V90伺服能够无缝对接… 2026/7/5 12:56:00
前端转大模型:页面开发到 AI 产品工程师,用排错清单压住复杂度 聊《前端转大模型:页面开发到 AI 产品工程师,用排错清单压住复杂度》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要这篇面向想进入 AI 应用方向的前端开发者,但不会把“前端… 2026/7/5 12:51:58
基于YOLO的智能麻将识别:从数据标注到模型部署全流程实战 这次我们来看一个用 Ultralytics YOLO 框架从零开始打造一个“智能麻将机器人”的完整项目。这个项目的核心不是讲复杂的机器人控制,而是聚焦于如何利用 YOLO 这一成熟的计算机视觉工具,快速、高效地解决一个具体的、有趣的识别问题——识别麻将牌。对于… 2026/7/5 12:51:58
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/5 0:01:32
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/5 0:01:32
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/5 0:05:36
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/5 0:01:32
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/5 0:01:32
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/5 0:05:36