一文详解用RAGFlow + Dify搭建高质量AI问数应用

图片

如何让业务人员摆脱SQL,直接用自然语言获取数据?本文分享一个实用案例:结合RAGFlow与Dify两大开源工具,构建高质量的AI问数应用。

前言

经过3天的验证测试,我发现RAGFlow与Dify产品组合在生成AI问数质量方面展现出了强大潜力。虽然存在一些不足,但RAGFlow成功填补了Dify知识库应用的短板,形成了一个高效互补的解决方案。

从整体逻辑构建来看:

  • Dify:擅长快速构建MVP产品原型,其插件系统和自定义工具使构建AI应用变得简单高效
  • RAGFlow:贡献两个关键能力: ①提供高质量知识库数据源;②通过NL2SQL功能作为AI问数的专业Agent

整体流程

整体架构图整体架构图

RAGFlow+Dify实际效果展示

从实际效果来看,这一组合实现的Agent逻辑非常符合预期,能够很好地完成多表关联查询等复杂任务:

1. Agent整体呈现结果

系统结构图Agent整体呈现结果

2. 复杂分析型查询支持

系统能够理解并处理复杂的分析型查询语句,生成准确的SQL查询并返回有价值的结果:

分析型查询示例1分析型查询示例1

分析型查询示例2分析型查询示例2

3. 三段式结果呈现

系统采用了清晰的三段式呈现方式,提升用户体验:

  • ① 首先展示SQL查询语句
  • ② 然后展示数据结果
  • ③ 最后提供总结分析

结果呈现示例结果呈现示例

小贴士:这种呈现方式让技术人员能够验证SQL正确性,同时也让业务人员直接看到结论,兼顾了不同用户需求。

实现步骤详解

整个实现过程分为几个关键步骤,下面详细说明:

1. Agent的设计架构

Agent作为整个系统的核心能力引擎,分为四个主要部分:

1.1 Agent提示词设计

明确定义Agent的身份定位和工作方法,通过精心设计的提示词引导AI生成高质量查询:

Agent提示词设计Agent提示词设计

关键点:好的提示词设计是高质量SQL生成的基础,需要明确告诉模型应该如何理解数据结构和生成查询。

1.2 知识库接入

系统采用RAGFlow提供的外部知识库,实现步骤如下:

第一步:引入外部知识库API

引入外部知识库API引入外部知识库API

第二步:接入RAG知识库

接入RAG知识库接入RAG知识库

1.3 工作流工具集成

Dify将工作流转化为可调用工具,使Agent能够实现自然语言查询:

第一步:构建工作流

构建工作流构建工作流

第二步:将工作流发布为工具

由于Agent只能通过Function Calling调用工具,需要将工作流发布为可调用的工具:

发布为工具发布为工具

第三步:优化工具描述

工具描述需要精心设计,帮助LLM准确理解工具功能并正确触发调用:

优化工具描述优化工具描述

实用技巧:工具描述是给LLM看的,而非给人看的,需要包含足够信息让模型理解何时以及如何调用该工具。

1.4 RAGFlow Agent集成

将RAGFlow的Agent作为工作流的核心环节,负责高质量SQL生成。RAGFlow Agent接口包含两个部分:

第一步:创建Agent会话

创建Agent会话创建Agent会话

第二步:与Agent交互

与Agent交互与Agent交互

2. 自定义API接口开发

为有效管理RAGFlow Agent会话,开发了一个自定义FastAPI接口,实现以下功能:

  • 会话管理:确保Dify Agent与RAGFlow Agent会话保持同步,保留上下文记忆
  • 对话交互:通过会话与RAGFlow Agent进行对话并获取回复

自定义API接口自定义API接口

注意:当前实现仅支持单会话对接RAGFlow Agent,多会话支持需要额外开发。

3. 接口注册与集成

将自定义接口注册到系统中,遵循OpenAPI 3.0规范:

接口注册接口注册

技术提示:可以让LLM协助生成OpenAPI 3.0规范的接口描述文档,提高开发效率。

4. RAGFlow Agent知识库设计

RAGFlow Agent的核心优势在于其高质量知识库,这也是保证SQL生成质量的关键因素。优质的知识库能提供准确的上下文信息,而低质量的知识库则可能导致误导和错误的SQL生成:

知识库设计知识库设计

结语

本文简要介绍了RAGFlow与Dify结合实现AI问数的验证方案。限于篇幅,无法详尽展示所有技术细节,有兴趣的读者可通过私信交流,我将尽可能整理更多细节到飞书文档中。

值得注意的是,AI问数仅解决了业务人员的基础取数需求,但业务分析还需要更进一步。未来的发展方向是基于数据指标完成归因分析,包括:

  • ✅ 建立归因链路中各指标对应的业务脉络知识库
  • ✅ 明确各指标的计算方法
  • ✅ 调度Agent进行指标数据检索
  • ✅ 完成数据结果的归因诊断

归因分析是一个需要大量企业个性化定制的知识库工程,但方法论是相通的。欢迎有志同道合的朋友一起交流探讨!

如何零基础入门 / 学习AI大模型?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高

那么我作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,希望可以帮助到更多学习大模型的人!至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

👉 福利来袭CSDN大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

全套AGI大模型学习大纲+路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

read-normal-img

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈
基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉 福利来袭CSDN大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

img

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

### Dify智能体实现多级据库查询方法 在构建能够执行复杂操作的Dify智能体时,特别是涉及多级据库查询的任务,通常需要设计一种机制来确保智能体可以有效地访并处理来自不同层次的据源。虽然直接关于Dify智能体进行多级据库查询的具体描述未见于现有资料中[^2],但从已有的技术实践出发,可推测此类功能的设计思路。 #### 设计理念 为了使Dify智能体支持多级据库查询,应当考虑采用模块化架构,其中每个组件负责特定的功能层面上的操作。这包括但不限于据获取、预处理以及最终的结果聚合。对于跨多个据库级别的查询而言,关键是建立一套统一接口标准,使得各个独立运行的服务之间能顺畅通信,并且能够在必要时候协调工作流程。 #### 技术栈选择 考虑到性能优化与兼容性的需求,在技术选型上推荐使用现代化框架和技术工具集: - **ORM (对象关系映射)**:如SQLAlchemy或Peewee可以帮助简化Python应用程序同关系型据库之间的交互过程; - **异步编程模型**:利用asyncio库配合aiohttp等网络请求库来进行非阻塞式的HTTP调用; - **消息队列服务**:例如RabbitMQ或者Kafka可用于解耦前后端逻辑,允许后台任务按需触发而不影响前端用户体验; ```python from sqlalchemy import create_engine, MetaData, Table, select import asyncio import aiohttp class DatabaseQueryAgent: def __init__(self, db_urls): self.engines = {name: create_engine(url) for name, url in db_urls.items()} async def fetch_data(self, query_params): tasks = [] metadata = MetaData() for dbname, params in query_params.items(): table_name = params['table'] columns = params.get('columns', '*') engine = self.engines[dbname] tbl = await loop.run_in_executor(None, lambda: Table(table_name, metadata, autoload_with=engine)) stmt = select([tbl.c[col] for col in columns]) task = asyncio.create_task(execute_query(engine, stmt)) tasks.append(task) results = await asyncio.gather(*tasks) return aggregate_results(results) async def execute_query(engine, statement): conn = await engine.connect() result_proxy = await conn.execute(statement) rows = await result_proxy.fetchall() await conn.close() return rows def aggregate_results(result_sets): combined_result = {} # Implement logic to merge multiple datasets into one coherent structure. pass if __name__ == "__main__": agent = DatabaseQueryAgent({ 'db1': "sqlite:///example1.db", 'db2': "postgresql://user:password@localhost/example2" }) queries = { 'db1': {'table': 'users'}, 'db2': {'table': 'orders'} } final_output = asyncio.run(agent.fetch_data(queries)) ``` 此代码片段展示了如何创建一个多线程环境下的代理类`DatabaseQueryAgent`用于并发地向两个不同的据库发出查询命令,并收集返回的信息。需要注意的是实际应用环境中还需要加入错误处理机制以及其他必要的安全措施以保障系统的稳定可靠运作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值