DeepSeek+dify知识库,查询数据库的两种方式(api+直连)

一直有小伙伴介绍在问我,怎么让在个ai应用客户端直接连接数据库查询。dify官方没有现成的组件可以直接用。

当时我想的是两种方式,一种是基于代码执行模块直接查询数据库,一种是基于Http请求,调用自己封装接口来查询数据库。

基于接口执行数据库查询

想干这事之前先梳理下流程img

  • 用户输入问题,根据用户的问题提出关键词
  • 通过http调用外部服务接口,根据关键词查询数据库
  • 返回200,调用大模型,将用户问题和知识进行梳理
  • 返回其他,直接输出

本地准备

要求:

  • 有一个python环境
  • 安装pymysq和flask 组件python -m pip install pymysql flask
  • 有一个mysql,或其他的数据库,我有mysql直接用了

接口开发

让kimi给我生成一个文章表,并且插入10条数据,我们可以告诉kimi,文章长度多大,这样内容可以丰富些。img直接让kimi生成一个暴露接口查数据库的服务,有简单的优化了下,将下面的内容放入到server.py文件中

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("接收到请求")
    # 获取关键字
    keyword = request.json.get('keyword')
    print("keyword为:"+keyword)
    ifnot keyword:
        return jsonify({"error": "Keyword is required"}), 400
    
    # 参数化查询,避免 SQL 注入,修改成自己的库
    query = "SELECT * FROM articles WHERE content LIKE %s"
    params = ('%' + keyword + '%',)
    
    try:
        # 建立数据库连接
        connection = pymysql.connect(**DATABASE_CONFIG)
        with connection.cursor() as cursor:
            # 执行查询
            cursor.execute(query, params)
            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__':
    # 注意这里绑定本机的内容ip,省事点,就0.0.0.0即可。不要绑定127.0.0.1,docke内访问不到
    app.run(host='10.1.0.65', port=8000)

启动服务

 python .\server.py

配置工作流

img创建一个空白应用。img在开始节点添加一个输入字段context

img

添加一个LLM,把开始节点设置的context字段作为上下文传入,并设置提示词提取关键词。

img添加一个http请求节点,把我们在接口开发里的地址和接口名填写进去2,然后把大模型的输出作为关键词填写到请求body里3,我们关闭重试机制4

这里要注意下:json的引号是中文的,最好在外面写好校验过了再放进去。img在HTTP请求的输出变量里,我们只关注status_code 响应状态码和响应内容即可。

img添加一个条件分支1,然后设置HTTP响应码为200的时候,连接到大模型。其他直接结束。

img添加大模型,将HTTP请求的响应体作为上下文给大模型,输入提示词,让大模型根据知识,验证,并进行合理性的验证,最后结构化返回。

img在结束节点中,我们把大模型整理的内容输出。

img试运行效果。

基于代码执行查询数据库

img

由于difysandbox的安全限制

  • 不能访问文件系统
  • 不能进行网络请求
  • 不能执行操作系统级命令

官方也有了对应的说明,见文档。 https://github.com/langgenius/dify-sandbox/blob/main/FAQ.mdss

img

  • 官方已经告诉我们沙箱里添加了哪些权限
  • 如果我们要添加可以在哪里添加

difysandbox源码修改

一定要使用linux环境`、`一定要使用linux环境``一定要使用linux环境

我从github上拉下代码以后,搜索``syscalls_amd64.go

img一共有4个文件,

  • nodejs的系统调用,有amd和arm平台
  • python的系统,也是有amd和arm平台

我用python,不是arm架构的,镜像都是linux的。

我们直接问kimi即可。

imgps:这个问题丢给了ds和chatgpt都是瞎回答

img一步步的问kimi,最后告诉我要添加哪些。整理以后添加到代码里。

var ALLOW_SYSCALLS = []int{  
    // file io  
    syscall.SYS_NEWFSTATAT, syscall.SYS_IOCTL, syscall.SYS_LSEEK, syscall.SYS_GETDENTS64,  
    syscall.SYS_WRITE, syscall.SYS_CLOSE, syscall.SYS_OPENAT, syscall.SYS_READ,  
    // thread  
    syscall.SYS_FUTEX,  
    // memory  
    syscall.SYS_MMAP, syscall.SYS_BRK, syscall.SYS_MPROTECT, syscall.SYS_MUNMAP, syscall.SYS_RT_SIGRETURN,  
    syscall.SYS_MREMAP,  

    // user/group  
    syscall.SYS_SETUID, syscall.SYS_SETGID, syscall.SYS_GETUID,  
    // process  
    syscall.SYS_GETPID, syscall.SYS_GETPPID, syscall.SYS_GETTID,  
    syscall.SYS_EXIT, syscall.SYS_EXIT_GROUP,  
    syscall.SYS_TGKILL, syscall.SYS_RT_SIGACTION, syscall.SYS_IOCTL,  
    syscall.SYS_SCHED_YIELD,  
    syscall.SYS_SET_ROBUST_LIST, syscall.SYS_GET_ROBUST_LIST, SYS_RSEQ,  

    // time  
    syscall.SYS_CLOCK_GETTIME, syscall.SYS_GETTIMEOFDAY, syscall.SYS_NANOSLEEP,  
    syscall.SYS_EPOLL_CREATE1,  
    syscall.SYS_EPOLL_CTL, syscall.SYS_CLOCK_NANOSLEEP, syscall.SYS_PSELECT6,  
    syscall.SYS_TIME,  

    syscall.SYS_RT_SIGPROCMASK, syscall.SYS_SIGALTSTACK, SYS_GETRANDOM,  
    //新增  
    5, 6, 7, 21, 41, 42, 44, 45, 51, 54, 55, 107, 137, 204, 281,  
}

预装mysql操作包

既然我们要操作在沙箱里操作mysql,那我们得在对应的环境中预装下mysql客户端。

img1对应的文件中添加2对应的pymysql==1.1.1,我直接安装最新版。

在readme中有操作步骤

### Steps

1. Clone the repository using `git clone https://github.com/langgenius/dify-sandbox` and navigate to the project directory.
2. Run ./install.sh to install the necessary dependencies.
3. Run ./build/build_[amd64|arm64].sh to build the sandbox binary.
4. Run ./main to start the server.

编译成功以后,打包镜像。因为我没有环境,直接模拟了下创建了一个main和env目录

img

然后模拟打包镜像。在根目录中执行下面的命令

docker build -f docker/amd64/dockerfile -t dify-sandbox:local .

我在win上打包报了一堆错,都扔给kimi,一步步的解决。最后成功。

img

沙箱网咯策略配置

在我们的安装dify的的时候,有个dify/docker/ssrf_proxy目录,找到squid.conf.template

img

在这里,你可以设置允许访问的网络,允许访问的端口,生产一定要最小权限

acl devnet src 10.1.0.0/24
acl devnet src 10.255.200.0/24

acl Safe_ports port 3306        # MySQL
acl Safe_ports port 5432        # Postgres
acl Safe_ports port 27017       # MongoDB
acl Safe_ports port 6379        # Redis

http_access allow devnet
  • devnet 为定义的规则集名称,后面跟自己的ip段设置,表示:10.255.200.110.255.200.254-acl Safe_ports port 允许访问的端口
  • http_access allow devnet 允许访问的规则集

重新部署dify

在dify的的docker目录中修改docker-compose.yaml文件sandbox使用本地镜像。

  sandbox:
    #image: langgenius/dify-sandbox:0.2.10
    image: dify-sandbox:local
    restart: always
    environment:

imagelanggenius/dify-sandbox:0.2.10 改为了dify-sandbox:local

在docker目录下执行以下命令

# 销毁
docker compose down
# 重新部署
docker compose up -d

脚本

使用kimi生成了一个python代码

import sys
import pymysql
import os

def connect_to_database():
    """ 连接到数据库,配置都从环境变量里取 """
    try:
        # 从环境变量或配置文件中获取数据库参数
        host = os.getenv("DB_HOST", "localhost")
        user = os.getenv("DB_USER", "root")
        password = os.getenv("DB_PASSWORD", "password")
        database = os.getenv("DB_NAME", "database_name")
        
        conn = pymysql.connect(
            host=host,
            user=user,
            password=password,
            database=database,
            charset='utf8mb4',
            cursorclass=pymysql.cursors.DictCursor  # 使用字典游标
        )
        return conn
    except pymysql.MySQLError as err:
        print(f"Error connecting to database: {err}")
        returnNone

def execute_query(conn, query, params=None):
    """ 执行 SQL 查询,并支持参数化查询 """
    cursor = conn.cursor()
    try:
        if params:
            cursor.execute(query, params)
        else:
            cursor.execute(query)
        return cursor.fetchall()
    except pymysql.MySQLError as err:
        print(f"Error executing query: {err}")
        returnNone
    finally:
        cursor.close()

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

def main(arg1: str) -> dict:
    # 参数化查询,避免 SQL 注入
    query = "SELECT * FROM table_name WHERE column LIKE %s"
    params = ('%' + arg1 + '%',)
    
    # 连接到数据库
    conn = connect_to_database()
    ifnot conn:
        sys.exit(1)
    
    try:
        # 执行查询
        result = execute_query(conn, query, params)
        
        if result isNone:
            return {"result": [], "markdown": ""}
        
        # 生成 Markdown 表格
        markdown_table = generate_markdown_table(result)
        
        return {
            "result": result,
            "markdown": markdown_table
        }
    except Exception as e:
        print(f"Unexpected error: {e}")
        return {"result": [], "markdown": ""}
    finally:
        # 确保数据库连接关闭
        conn.close()

后记

这两种方式,不管哪种都能实现查询数据库,但是有个问题,数据量小的时候性能还行,数据量大了,你查询一次就得耗时好久。

如果知识固定,也可以前置设置一个知识库把关键词和文章映射出来,这样大模型整理的时候,尽量的去往对应的关键词上靠。

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

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

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

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

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

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

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

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

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

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

read-normal-img

640套AI大模型报告合集

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

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

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

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

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

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

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

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

img

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

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

<think>好的,用户现在想查找Dify知识库API的具体位置或文档地址。我需要先回顾之前的对话和相关引用,确保准确回答。首先,用户之前的问题是关于如何用Dify API创建知识库,我提供了详细的步骤和示例代码。现在用户进一步询问API入口和文档的位置。根据引用内容,DifyAPI通常通过其RESTful接口访问,但用户可能需要具体的URL和文档链接。检查引用[3],其中提到Dify的安装和配置步骤,包括克隆源码和启动容器。这可能意味着Dify的文档可能在其官方GitHub仓库或官方网站。引用[2]提到Dify的sandbox机制和高级应用,但没有直接给出API文档地址。引用[1]和[4]涉及知识库配置,但同样没有API入口信息。 考虑到Dify是开源项目,官方文档应在线提供。用户可能需要访问Dify的官方文档网站,通常为https://docs.dify.ai/,这里会有API部分的详细说明。此外,在安装Dify后,本地部署的实例可能提供SwaggerUI或API文档入口,如http://localhost/service/api,但具体端口取决于部署方式。 需要确认用户是否已经部署了Dify,如果是本地部署,API入口可能是本地地址加特定路径。同时,建议用户查阅官方文档获取最新信息,因为版本更新可能影响API路径。另外,用户可能需要API密钥进行身份验证,这在之前的回答中已经提到过,所以需要提醒用户确保已获取正确的API密钥。 总结,用户需要的是Dify知识库API的具体入口和文档地址,应指向官方文档和可能的本地实例路径,并提醒注意版本和部署方式的影响。</think>### Dify 知识库 API 入口及文档说明 #### 1. 官方文档地址 Dify 的 **API 文档** 集成在其官方文档中,可通过以下地址访问: ``` https://docs.dify.ai/v/zh-hans/guides/apis ``` 该文档包含完整的 API 接口说明,涵盖知识库管理、模型调用、数据上传等操作[^3]。 #### 2. API 入口基础路径 DifyAPI 入口基础路径根据部署方式不同有所差异: - **默认部署**(本地或云服务器): ``` http://<your_dify_domain>/v1 ``` - **Docker 部署**(默认端口): ``` http://localhost/service/api/v1 ``` 具体端口需根据 `docker-compose.yml` 中的配置调整[^3]。 #### 3. 知识库相关 API 路径 | 功能 | 请求方法 | 路径 | |----------------|----------|------------------------------| | 创建知识库 | POST | `/knowledge_bases` | | 查询知识库列表 | GET | `/knowledge_bases` | | 更新知识库 | PUT | `/knowledge_bases/{kb_id}` | | 删除知识库 | DELETE | `/knowledge_bases/{kb_id}` | #### 4. 快速验证 API 可通过以下命令验证 API 连通性(需替换 `YOUR_API_KEY`): ```bash curl -X GET "http://localhost/service/api/v1/knowledge_bases" \ -H "Authorization: Bearer YOUR_API_KEY" ``` #### 5. 文档关键内容 在官方文档中重点关注以下章节: - **知识库管理 API**:包含字段定义和请求示例 - **认证方式**:API Key 的使用规范 - **速率限制**:不同套餐的 API 调用限制 - **错误代码**:包含 `401 Unauthorized`, `404 Not Found` 等常见错误说明[^3][^4] ### 示例:获取知识库列表 ```python import requests url = "http://localhost/service/api/v1/knowledge_bases" headers = {"Authorization": "Bearer YOUR_API_KEY"} response = requests.get(url, headers=headers) print(response.json()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值