使用dify的api连接外部知识库,dify连接ragflow的知识库(附java代码)

dify的知识库一般般,但是ragflow的知识库很强大,今天教大家如何使用dify连接ragflow的知识库

一.ragflow的准备工作

1.在ragflow建立一个知识库,拿到知识库的id,红框圈出来的地方就是这个知识库的id,后面要用到

2.拿到ragflow的api的key

二.写代码,将ragflow的接口返回的内容按照dify的标准格式进行组装

这里我使用的是Java代码,本地直接新建一个空的springboot项目,然后将以下代码复制粘贴,修改下参数即可

实体类(无需修改)

java 复制代码
public class RetrievalSetting {
    @NotNull
    private int top_k;
    @NotNull
    private float score_threshold;

    // Getters and Setters
    public int getTop_k() {
        return top_k;
    }

    public void setTop_k(int top_k) {
        this.top_k = top_k;
    }

    public float getScore_threshold() {
        return score_threshold;
    }

    public void setScore_threshold(float score_threshold) {
        this.score_threshold = score_threshold;
    }
}
java 复制代码
public class RetrievalRequest {
    @NotBlank
    private String knowledge_id;
    @NotBlank
    private String query;
    @NotNull
    private RetrievalSetting retrieval_setting;

    // Getters and Setters
    public String getKnowledge_id() {
        return knowledge_id;
    }

    public void setKnowledge_id(String knowledge_id) {
        this.knowledge_id = knowledge_id;
    }

    public String getQuery() {
        return query;
    }

    public void setQuery(String query) {
        this.query = query;
    }

    public RetrievalSetting getRetrieval_setting() {
        return retrieval_setting;
    }

    public void setRetrieval_setting(RetrievalSetting retrieval_setting) {
        this.retrieval_setting = retrieval_setting;
    }
}
java 复制代码
@RestController
@RequestMapping("/")
public class RetrievalController {
    private static final String ORIGINAL_API_URL = "http://你的ragflowapi的主机和端口/api/v1/retrieval";

    @PostMapping("/retrieval")
    public ResponseEntity<Map<String, List<Map<String, Object>>>> retrieveChunks(
            @RequestBody RetrievalRequest requestData,
            @RequestHeader("Authorization") String authorization) {
        // 验证 Authorization 头
        if (!authorization.startsWith("Bearer ")) {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(null);
        }
        String apiKey = authorization.split(" ")[1];

        // 构建请求体
        Map<String, Object> payload = new HashMap<>();
        payload.put("question", requestData.getQuery());
        payload.put("dataset_ids", Collections.singletonList(requestData.getKnowledge_id()));
        payload.put("top_k", requestData.getRetrieval_setting().getTop_k());
        payload.put("similarity_threshold", requestData.getRetrieval_setting().getScore_threshold());

        // 构建请求头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("Authorization", "Bearer " + apiKey);
        HttpEntity<Map<String, Object>> entity = new HttpEntity<>(payload, headers);

        // 发送请求
        RestTemplate restTemplate = new RestTemplate();
        try {
            ResponseEntity<Map> response = restTemplate.exchange(
                    ORIGINAL_API_URL,
                    HttpMethod.POST,
                    entity,
                    Map.class
            );

            if (response.getStatusCode() != HttpStatus.OK) {
                return ResponseEntity.status(response.getStatusCode()).body(null);
            }

            // 处理响应数据
            Map<String, Object> originalData = response.getBody();
            Map<String, Object> data = (Map<String, Object>) originalData.get("data");
            List<Map<String, Object>> chunks = (List<Map<String, Object>>) data.get("chunks");

            List<Map<String, Object>> records = new ArrayList<>();
            if (chunks != null) {
                for (Map<String, Object> chunk : chunks) {
                    Map<String, Object> record = new HashMap<>();
                    record.put("content", chunk.get("content"));
                    record.put("score", chunk.get("similarity"));
                    record.put("title", chunk.getOrDefault("document_keyword", "Unknown Document"));
                    Map<String, Object> metadata = new HashMap<>();
                    metadata.put("document_id", chunk.get("document_id"));
                    record.put("metadata", metadata);
                    records.add(record);
                }
            }

            Map<String, List<Map<String, Object>>> result = new HashMap<>();
            result.put("records", records);
            return ResponseEntity.ok(result);
        } catch (HttpClientErrorException e) {
            return ResponseEntity.status(e.getStatusCode()).body(null);
        }
    }
}

在controller中修改主机和端口,能在这里找到:

完事可以用api工具测试一下这个接口通不通

注意这里请求头要加一个Bearer 然后接上apikey,中间有个空格

三.dify连接ragflow的知识库

1.rag先连接

2.新建知识库

3.进行召回测试

这里是我运行的结果,完美

至此结束,撒花

相关推荐
非优秀程序员2 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
知已难寻3 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
沐晓时光3 小时前
C语言入门,内存函数知识讲解
c语言·开发语言
文丑颜不良啊5 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang6 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪6 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息7 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
梦想恒远7 小时前
Spring Boot + LangChain4j 统计 token 成本:ChatModelListener 实测与单价口径
spring boot·后端
秋饼7 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff8 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈