DeepSeek+dify 工作流应用,自然语言查询数据库信息并展示


背景
 

在写连接外部数据库查询的时候,我就想普通的业务人员没有编程背景,不懂数据库,可他们想查询统计一些东西怎么办?只能找对应的开发人员写sql了,那我是不是可以用工作流解决这个问题。

简单的梳理了下流程。


脚本
 

我先把在 xxx里写的python脚本改下,由关键词检索改成sql检索。


from flask import Flask, request, jsonify
import pymysql

app = Flask(__name__)

# 数据库配置
DATABASE_CONFIG = {
    'host'''# 自己的数据库地址
    'user'''# 自己数据库的账户
    'password'''#自己数据库的密码
    'db''demo'# 自己数据库的库名
    'charset''utf8mb4',
    'cursorclass': pymysql.cursors.DictCursor
}

@app.route('/query', methods=['POST'])
def query_database():
    print("接收到请求")
    # 获取查询sql
    querySql = request.json.get('querySql')
    print("querySql为:"+querySql)
    # 去除 Markdown 标识和不必要的字符
    if querySql:
        # 去除开头的 ````sql`
        querySql = querySql.replace('```sql\n''')
        
        # 去除结尾的 ````
        querySql = querySql.replace('\n<>''')
        
        # 去除多余的空格和换行符
        querySql = querySql.strip()
        # 将换行符替换为空格(如果需要保持多行,可以省略这一步)
        querySql = querySql.replace('\n'' ')
        querySql = querySql.replace('```'' ')
        # 去除多余的空格
        querySql = ' '.join(querySql.split())
        
    ifnot querySql:
        return jsonify({"error""querySql is required"}), 400
    
    try:
        # 建立数据库连接
        connection = pymysql.connect(**DATABASE_CONFIG)
        with connection.cursor() as cursor:
            # 执行查询
            cursor.execute(querySql)
            result = cursor.fetchall()
        
        connection.commit()
        connection.close()

        ifnot result:
            return"未查询到有效数据"400
        
        # 生成 Markdown 表格
        markdown_table = generate_markdown_table(result)
        
        return markdown_table, 200
    
    except Exception as e:
        return str(e), 500

def generate_markdown_table(results):
    """ 生成 Markdown 表格 """
    ifnot results:
        return""
    # 获取列名
    columns = results[0].keys()
    
    # 表头
    table_md = "| " + " | ".join([col for col in columns]) + " |\n"
    # 分隔线
    table_md += "| " + " --- |" * len(columns) + "\n"
    
    # 表格内容
    for row in results:
        table_md += "| " + " | ".join([str(cell) for cell in row.values()]) + " |\n"
    
    return table_md

if __name__ == '__main__':
    app.run(host='10.1.0.65', port=8000)

执行命令python .\server2.py,启动服务


知识库
 


数据准备与结构分析

我把库表结构从数据库里导出一份表结构,导出到相同的文件里,建立一个知识库。要求数据库表必须有完整的注释。

我们可以看到导出的表结构我们可以用DROP TABLE IF EXISTS 分割文本。


创建知识库

将导出的表结构,上传到知识库。

按照DROP TABLE IF EXISTS分割文本,将2设置为4000,预览下分段,效果还行,把最大分段长度调大,防止同一个表结构被分到不同的段落。我们使用混合检索,Score的阈值不要调太大,一般0.3即可,别看图。


复制工作流
 

回到工作室,我们复制一个工作流出来。

改下名称。


节点设置

添加一个知识检索节点,把开始节点的用户输入context作为查询变量,添加刚才添加的数据库知识库。

我们把LLM节点调整下,修改下2的名称,上线文2改成知识检索的结果.调整下提示词让它根据知识和用户需求生成查询sql。

调整下HTTP请求中的查询字段,我改成了querySql,根据自己的代码来。

结束节点直接把HTTP的body返回。最后整体流程。


调试

写sql的能力忽高忽低,得找个代码模型。


后记
 

  • 1 表结构的注释很关键
  • 2分段也很关键
  • 3匹配度0.3就可以了
  • 4 可以不断的优化提示词,优化sql
  • 5 deepseek一直返回思考过程,可以在后端去掉或者在dify中通过代码来移除
  • 6 这只是一个示例,生产需要不断的调试

?【三连好运 福利拉满】?

? 若本日推送有收获:
? 点赞 → 小手一抖,bug没有
? 在看 → 一点扩散,知识璀璨
? 收藏 → 代码永驻,防止迷路
? 分享 → 传递战友,功德+999
? 关注 → 追更不迷路,干货永同步

? 若有槽点想输出:
? 评论区已铺好红毯,等你来战!



请使用浏览器的分享功能分享到微信等