Dify 知識庫外接 RAGFlow 喂飯教程!附避坑指南 原創(chuàng)
背景
在我們之前的文章中,我們對比了dify,ragflow和n8n這三個工具的使用場景及其差異。實際上,在企業(yè)中,這些工具通常會被結(jié)合起來使用,以便充分發(fā)揮各自的優(yōu)勢。例如,盡管ragflow也具備一些智能功能,但是與dify相比,它在這方面的表現(xiàn)力還有待提高。然而,當談到解析和檢索的能力時,ragflow卻顯著超過了dify。在今天的文章中,我們將探討如何有效地將這兩個工具結(jié)合使用。
RAGFlow
核心功能
我覺得 RAGflow 最大的一個亮點就是支持各種基于模板的解析模式和多樣的模型支持,這主要是通過??deepdoc?
?模塊實現(xiàn)。這種靈活性使得 RAGflow 能夠適應不同類型的文檔和數(shù)據(jù)結(jié)構(gòu),從而提高解析的準確性和效率。在RAGFlow剛出來的時候,我們就開始利用其deepdoc模塊幫我們做文檔解析,效果比langchain內(nèi)置的pymupdf效果要好很多。
具體來說,RAGflow 提供了以下幾種解析模式和模型支持:
- 基于規(guī)則的解析:適用于結(jié)構(gòu)化程度較高的文檔
- 基于典型數(shù)據(jù)結(jié)構(gòu)的解析:例如 Paper, Table 等類型的數(shù)據(jù)
- 基于 Graph 的解析:參考 GraphRAG 構(gòu)建知識集的 Knowledge Graph 知識圖譜
安裝要求
硬件指標:
- CPU >= 4 cores
- RAM >= 16 GB
- Disk >= 50 GB
- Docker >= 24.0.0 & Docker Compose >= v2.26.1
內(nèi)存映射:
sudo sysctl -w vm.max_map_count=262144
ragflow 依賴 Elasticsearch,Elasticsearch 官方建議將其調(diào)整為262144值
值得一提的是,RAGFlow 對于硬件的要求還是挺高的,我在一臺只剩不到7個G內(nèi)存的服務器上運行ragflow,明顯能感覺到卡頓,一看內(nèi)存就剩100多M了!
知識庫
官方說 RAGFlow的知識庫提供多個分塊模板供用戶選擇,方便分塊不同布局的文件,盡可能地確保語義完整性。在分塊方法中,我們可以選擇適合文件布局和格式的默認模板。下表顯示了每個支持的塊模板的描述和兼容的文件格式.
模板 | 文件格式 |
General | DOCX、EXCEL、PPT、PDF、TXT、JPEG、JPG、PNG、TIF、GIF |
Q&A | EXCEL、CSV/TXT |
Manual | |
Table | EXCEL、CSV/TXT |
Paper | |
Book | DOCX、PDF、TXT |
Laws | DOCX、PDF、TXT |
Presentation | PDF、PPTX |
Picture | JPEG、JPG、PNG、TIF、GIF |
One | DOCX、EXCEL、PDF、TXT |
我們還可以在創(chuàng)建并配置完知識庫之后,在知識庫的數(shù)據(jù)集頁面上更改特定文件的塊模板之后再執(zhí)行文檔的解析。
Dify接入RAGFlow
雖然dify自身的文檔解析能力相對較弱,但ragflow在這方面卻表現(xiàn)出色。那么我們是否可以利用dify去接入ragflow的知識庫呢?實際上,ragflow確實支持這種功能,并專門為dify提供了一個單獨的API,使其可以從ragflow的知識庫中進行檢索。
我們可以從源碼中找到對應的接口及代碼:
從這個api 可以看到,請求體的json應該長這樣:
{
"query": "what is meme?",
"knowledge_id": "xxxx",
"use_kg": false,
"retrieval_setting": {"score_threshold": 0.0, "top_k": 1024}
}
有一點很重要,那就是在調(diào)用ragflow的API之前,你需要進行身份驗證。所以,我們首先需要申請一個密鑰(key)。
從RAGFlow的認證代碼不難看出,我們只需要把key放在請求的header中即可。
def apikey_required(func):
@wraps(func)
def decorated_function(*args, **kwargs):
token = flask_request.headers.get("Authorization").split()[1]
objs = APIToken.query(token=token)
if not objs:
return build_error_result(message="API-KEY is invalid!", code=settings.RetCode.FORBIDDEN)
kwargs["tenant_id"] = objs[0].tenant_id
return func(*args, **kwargs)
return decorated_function
在我們成功申請到API密鑰后,我們可以先使用curl命令來調(diào)試接口。首先,我們需要找到知識庫的ID,并將其用作??knowledge_id?
?。
curl --request POST \
--url http://192.168.35.16:8080/api/v1/dify/retrieval \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer ragflow-dmN2M4ZTUyNDgyYTExZjA5MWZmMDI0Mm' \
--data '
{
"query": "If you donot have the invitation code you can go to",
"knowledge_id": "b4bc18a6482211f0920a0242ac1c0006",
"use_kg": false,
"retrieval_setting": {"score_threshold": 0.45, "top_k": 5}
}'
得到的結(jié)果如下:
{"records":[{"content":"completetaskstoreceive theinvitation code.\nclick on the campaign button, which will take you to a screen where you must\nNote: If you don't have the invitation code you can go to http://quest.sending.me then,\nInvitation Code\nSendingMe\nSending You to the Free World\n Personal Signing\nCancel\nConfirm\nWhere can I get it?\nlog in instantly.","metadata":{},"score":0.487319856762247,"title":"Getting Started _ SendingMe User Manual.pdf"}]}
在api 驗證通過之后,我們就可以在dify外接知識庫連接到ragflow了。
我們需要將端點(endpoint)設(shè)置為本地IP地址,并加上??/api/v1/dify?
??作為后綴。然后,dify會在應用程序中自動添加??retrieval?
??,從而形成完整的路徑??/api/v1/dify/retrieval?
?:
// api/services/external_knowledge_service.py
def fetch_external_knowledge_retrieval(
tenant_id: str,
dataset_id: str,
query: str,
external_retrieval_parameters: dict,
metadata_condition: Optional[MetadataCondition] = None,
) -> list:
...
request_params = {
"retrieval_setting": {
"top_k": external_retrieval_parameters.get("top_k"),
"score_threshold": score_threshold,
},
"query": query,
"knowledge_id": external_knowledge_binding.external_knowledge_id,
"metadata_condition": metadata_condition.model_dump() if metadata_condition else None,
}
response = ExternalDatasetService.process_external_api(
ExternalKnowledgeApiSetting(
url=f"{settings.get('endpoint')}/retrieval",
request_method="post",
headers=headers,
params=request_params,
),
None,
)
...
接著我們可以在dify測試一下從ragflow的數(shù)據(jù)召回情況:
當檢索召回成功之后,說明整個流程已經(jīng)跑通了,我們就可以在問答或者工作流中使用這個外部知識庫了。
注意事項
- 當dify和ragflow配置在同一臺服務器,端口會有沖突,修改ragflow/docker/docker-compose.yml 中ragflow-server的端口即可
- dify配置的ragflow的端口地址,除了可以使用映射的80端口之外,也可以使用SVR_HTTP_PORT(默認值是9380)
- 上述使用的dify版本Version 1.4.1,ragflow的版本v0.19.0,其他版本沒測試過
本文轉(zhuǎn)載自??AI 博物院?? 作者:longyunfeigu
