Dify外接RAGFlow知识库

1. 部署RAGFlow

参考官网教程:ragflow/README_zh.md at main · infiniflow/ragflow · GitHub

配置要求:

  • CPU >= 4 核
  • RAM >= 16 GB
  • Disk >= 50 GB
  • Docker >= 24.0.0 & Docker Compose >= v2.26.1
  • Docker安装参考Install | Docker Docs

2. 创建RAGFlow知识库

3. 构建RAGFlow知识库API

参考Dify外部知识库API规范External Knowledge API | Dify

将RAGFlow自带的知识库检索APIHTTP API | RAGFlow封装成符合Dify外部知识库API规范的接口。

from fastapi import FastAPI, HTTPException, Header, Depends
from pydantic import BaseModel
import requests

app = FastAPI()

ORIGINAL_API_URL = "http://{your_ragflow _address}/api/v1/retrieval"


class RetrievalSetting(BaseModel):
    top_k: int
    score_threshold: float


class RetrievalRequest(BaseModel):
    knowledge_id: str
    query: str
    retrieval_setting: RetrievalSetting


def get_api_key(authorization: str = Header(...)):
    if not authorization.startswith("Bearer "):
        raise HTTPException(status_code=401, detail="Invalid Authorization header format.")
    return authorization.split(" ")[1]


@app.post("/retrieval")
def retrieve_chunks(request_data: RetrievalRequest, api_key: str = Depends(get_api_key)):
    payload = {
        "question": request_data.query,
        "dataset_ids": [request_data.knowledge_id],
        "top_k": request_data.retrieval_setting.top_k,
        "similarity_threshold": request_data.retrieval_setting.score_threshold
    }
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {api_key}"
    }
    response = requests.post(ORIGINAL_API_URL, json=payload, headers=headers)

    if response.status_code != 200:
        raise HTTPException(status_code=response.status_code, detail=response.json())

    original_data = response.json()
    records = [
        {
            "content": chunk["content"],
            "score": chunk["similarity"],
            "title": chunk.get("document_keyword", "Unknown Document"),
            "metadata": {"document_id": chunk["document_id"]}
        }
        for chunk in original_data.get("data", {}).get("chunks", [])
    ]
    return {"records": records}

import uvicorn

if __name__ == "__main__":
    uvicorn.run("app:app", host="0.0.0.0", port=8500, reload=True)

 4. 在Dify上连接外部知识库

  • Name = 随便
  • API Endpoint = 上面封装的API地址,例如:http://127.0.0.0:8500
  • API Key = RAGFlow的API Key

5. 召回测试

<think>好的,我现在需要帮用户解决如何将DifyRAGFlow知识库集成的问题。首先,用户提到了他们遇到同时部署时出现登录失败的问题,引用了修改NGINX端口的解决方法。这可能意味着端口冲突是常见问题,需要提醒用户注意端口配置。 接下来,我需要整理集成步骤。首先应该确认两者的部署环境是否兼容,比如Docker或Kubernetes。然后,用户可能需要配置API连接,这涉及到RAGFlow的API文档和Dify的应用设置。用户可能需要生成API密钥,并在Dify中创建自定义工具,输入RAGFlow的API端点。 另外,数据同步是关键步骤。用户需要知道如何将知识库数据导入RAGFlow,并确保Dify能访问这些数据。可能涉及文件上传和元数据配置,比如命名空间或标签。权限设置也不能忽视,要确保服务间通信的认证正确,比如API密钥或OAuth。 可能的问题包括网络连接、端口冲突、API版本兼容性以及数据格式是否正确。需要建议用户查看日志排查问题,并参考官方文档。用户可能需要分步指导,所以步骤要清晰,并给出示例配置,比如Docker Compose中的端口设置,避免冲突。 最后,生成相关问题,帮助用户深入解决可能遇到的性能优化、权限配置、数据同步和故障排除等问题。需要确保引用用户提供的解决方案,比如修改端口的部分,并在回答中标注引用标识。</think>### DifyRAGFlow知识库集成步骤 根据您提供的引用信息,DifyRAGFlow同时部署时可能因端口冲突导致登录异常。以下是集成步骤及注意事项: 1. **环境预配置** - 确保部署环境满足两者的系统要求(如Docker版本、内存等) - 修改默认端口配置避免冲突(参考示例): ```bash # RAGFlow配置 NGINX_PORT=18080 NGINX_SSL_PORT=9443 # Dify配置 NGINX_PORT=28080 NGINX_SSL_PORT=29443 ``` 该配置通过错开端口号解决冲突问题[^1] 2. **API连接配置** - 在RAGFlow中创建API访问密钥 - 通过Dify的「自定义工具」功能添加RAGFlow接口: ```yaml endpoints: - name: ragflow_search url: http://ragflow:18080/api/v1/search method: POST headers: Authorization: "Bearer {API_KEY}" ``` 3. **数据同步流程** - 将知识库文件上传至RAGFlow指定目录(支持PDF/DOCX/TXT等格式) - 在Dify应用设置中绑定RAGFlow命名空间: ```python from dify_client import KnowledgeBase kb = KnowledgeBase.connect( provider='ragflow', namespace='your_project', metadata_filter={"department": "technical"} ) ``` 4. **权限验证** - 确保双向服务通信的HTTPS证书配置 - 在Nginx反向代理中设置跨域访问头: ```nginx add_header 'Access-Control-Allow-Origin' $http_origin; add_header 'Access-Control-Allow-Credentials' 'true'; ``` **常见问题排查**: - 若出现`502 Bad Gateway`,检查容器网络是否互通 - 文档解析失败时,确认RAGFlow的OCR服务已正常启动 - API调用频率限制建议设置为每分钟60次以下
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值