RAGFlow部署与使用(开源本地知识库管理系统,包括kibana配置)

一、RAGFlow 简介

戳我访问RAGFlow

RAGFlow 是一款基于深度文档理解构建的开源 RAG(Retrieval-Augmented Generation)引擎。它可以给我们搭建本地知识库,将用户的知识文档上传到RAGFlow后,通过文档切分、向量入库,在用户向大语言模型提问后,从数据库中检索与问题相关的文档,把查找到的知识库数据输入到对话大模型中再生成答案输出。

RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程,结合大语言模型(LLM)针对用户各类不同的复杂格式数据提供可靠的问答以及有理有据的引用。它主要适用于需要动态生成内容且依赖外部知识库的场景,例如智能客服、文档生成、数据分析等。

此为系统架构图

在这里插入图片描述

二、部署RAGFlow

预先工作

安装前确保已经安装好了Docker

1. 确保 vm.max_map_count 不小于 262144

sysctl vm.max_map_count

如果 vm.max_map_count 的值小于 262144,可以进行重置

sudo sysctl -w vm.max_map_count=262144

改动会在下次系统重启时被重置。如果希望做永久改动,还需要在 /etc/sysctl.conf 文件里把 vm.max_map_count=262144 再相应更新一遍,:

vi /etc/sysctl.conf

修改后保存。

2. 克隆仓库

git clone https://github.com/infiniflow/ragflow.git

Docker方式

1. 修改 .env 文件,设置 RAGFLOW_IMAGE 来下载 RAGFlow 镜像的 v0.16.0 完整发行版。

默认的是 v0.16.0-slim 版本的,这个版本没有内置的内嵌模型,可能不太方便,建议安装完整发行版,即删除后面的-slim。

cd ragflow/docker
vi .env

修改 RAGFLOW_IMAGE=docker.1ms.run/infiniflow/ragflow:v0.16.0,注意这里的docker镜像代理也可以改成其他的。

2. 启动 RAGFlow ,查看启动日志

docker compose -f docker-compose.yml up -d
docker logs -f ragflow-server

出现以下界面提示说明服务器启动成功

     ____   ___    ______ ______ __
    / __ \ /   |  / ____// ____// /____  _      __
   / /_/ // /| | / / __ / /_   / // __ \| | /| / /
  / _, _// ___ |/ /_/ // __/  / // /_/ /| |/ |/ /
 /_/ |_|/_/  |_|\____//_/    /_/ \____/ |__/|__/

 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:9380
 * Running on http://x.x.x.x:9380
 INFO:werkzeug:Press CTRL+C to quit

访问服务器对应的 IP 地址并登录 RAGFlow。

可以在模型提供商中选择接入一些开源的平台,比如 GPUStack 中部署的模型,即可使用LLM。

在这里插入图片描述

3. kibana 配置(可视化查看向量数据库 ElasticSearch 相关存储的数据)

main 分支的 kibana 相关的docker-compose被删除了,不知道什么原因。

我们在 ragflow/docker 下 创建两个文件 docker-compose-admin-tool.yml 和 init-kibana.sh ,然后docker compose运行,即可在 6601 端口使用 kibana。
默认用户名密码在 .env 文件中配置, 用户名密码:rag_flow,infini_rag_flow

# docker-compose-admin-tool.yml 
include:
  - path: ./docker-compose.yml
    env_file: ./.env

services:
  kibana:
    image: kibana:${STACK_VERSION}
    container_name: ragflow-kibana
    environment:
      ELASTICSEARCH_USERNAME: ${KIBANA_USER}
      ELASTICSEARCH_PASSWORD: ${KIBANA_PASSWORD}
      ELASTICSEARCH_HOSTS: "http://es01:9200"
    ports:
      - ${KIBANA_PORT}:5601
    depends_on:
      es01:
        condition: service_healthy
      kibana-user-init:
        condition: service_completed_successfully

    networks:
      - ragflow
  kibana-user-init:
    image: appropriate/curl
    depends_on:
      es01:
        condition: service_healthy
    volumes:
      - ./init-kibana.sh:/app/init-kibana.sh
    environment:
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - KIBANA_USER=${KIBANA_USER}
      - KIBANA_PASSWORD=${KIBANA_PASSWORD}
    command: /bin/sh -c "sh /app/init-kibana.sh"
    networks:
      - ragflow
    restart: 'no'
# init-kibana.sh
#!/bin/bash

# unset http proxy which maybe set by docker daemon
export http_proxy=""; export https_proxy=""; export no_proxy=""; export HTTP_PROXY=""; export HTTPS_PROXY=""; export NO_PROXY=""

echo "Elasticsearch built-in user: elastic:${ELASTIC_PASSWORD}"

# Wait Elasticsearch be healthy
while true; do
    response=$(curl -s -v -w "\n%{http_code}" -u "elastic:${ELASTIC_PASSWORD}" "http://es01:9200")
    exit_code=$?
    status=$(echo "$response" | tail -n1)
    if [ $exit_code -eq 0 ] && [ "$status" = "200" ]; then
        echo "Elasticsearch is healthy"
        break
    else
        echo "Elasticsearch is unhealthy: $exit_code $status"
        echo "$response"
        sleep 5
    fi
done

# Create new role with all privileges to all indices
# https://www.elastic.co/guide/en/elasticsearch/reference/current/security-privileges.html#privileges-list-indices
echo "Going to create Elasticsearch role own_indices with all privileges to all indices"
while true; do
    response=$(curl -s -v -w "\n%{http_code}" -u "elastic:${ELASTIC_PASSWORD}" -X POST http://es01:9200/_security/role/own_indices -H 'Content-Type: application/json' -d '{"indices": [{"names": ["*"], "privileges": ["all"]}]}')
    exit_code=$?
    status=$(echo "$response" | tail -n1)
    if [ $exit_code -eq 0 ] && [ "$status" = "200" ]; then
        echo "Elasticsearch role own_indices created"
        break
    else
        echo "Elasticsearch role own_indices failure: $exit_code $status"
        echo "$response"
        sleep 5
    fi
done

echo "Elasticsearch role own_indices:"
curl -u "elastic:${ELASTIC_PASSWORD}" -X GET "http://es01:9200/_security/role/own_indices"
echo ""

PAYLOAD="{\"password\": \"${KIBANA_PASSWORD}\", \"roles\": [\"kibana_admin\", \"kibana_system\", \"own_indices\"], \"full_name\": \"${KIBANA_USER}\", \"email\": \"${KIBANA_USER}@example.com\"}"

echo "Going to create Elasticsearch user ${KIBANA_USER}: ${PAYLOAD}"

# Create new user
while true; do
    response=$(curl -s -v -w "\n%{http_code}" -u "elastic:${ELASTIC_PASSWORD}" -X POST http://es01:9200/_security/user/${KIBANA_USER} -H "Content-Type: application/json" -d "${PAYLOAD}")
    exit_code=$?
    status=$(echo "$response" | tail -n1)
    if [ $exit_code -eq 0 ] && [ "$status" = "200" ]; then
        echo "Elasticsearch user ${KIBANA_USER} created"
        break
    else
        echo "Elasticsearch user ${KIBANA_USER} failure: $exit_code $status"
        echo "$response"
        sleep 5
    fi
done

echo "Elasticsearch user ${KIBANA_USER}:"
curl -u "elastic:${ELASTIC_PASSWORD}" -X GET "http://es01:9200/_security/user/${KIBANA_USER}"
echo ""

exit 0

三、RAGFlow知识库构建相关

创建好知识库后,配置需要选择对应的文档语言以及嵌入模型(文档向量化用)。

在这里插入图片描述

可以打开知识图谱

在这里插入图片描述

解析方法需要选择对应的类型

在这里插入图片描述

正确配置知识库对于未来的AI聊天至关重要。例如,选择错误的嵌入模型或分块方法会导致聊天中意外的语义丢失或不匹配的答案。

RAGFlow提供了多个分块模板,以方便对不同布局的文件进行分块,并确保语义完整性。在Chunk方法中,您可以选择适合文件布局和格式的默认模板。下表显示了每个支持的区块模板的说明和兼容的文件格式:

模板描述文件格式
General文件将根据预设的块标记编号连续分块。DOCX, EXCEL, PPT, PDF, TXT, JPEG, JPG, PNG, TIF, GIF
Q&AEXCEL, CSV/TXT
ManualPDF
TableEXCEL, CSV/TXT
PaperPDF
BookDOCX, PDF, TXT
LawsDOCX, PDF, TXT
PresentationPDF, PPTX
PictureJPEG, JPG, PNG, TIF, GIF
One整个文档被分块为一个。DOCX, EXCEL, PDF, TXT

在这里插入图片描述

### 配置和访问RAGFlow部署的DeepSeek服务 为了实现同一网段内的设备可以访问通过 RAGFlow 部署的 DeepSeek 模型或服务,需要完成以下几个方面的配置: #### 1. 虚拟机物理主机在同一网段 要使虚拟机物理主机处于同一网段并能互相通信,需按照以下方法调整网络设置。假设使用 VMware 工具作为虚拟化平台,则可以通过桥接模式来实现这一目标[^1]。 - **VMware 网络适配器设置** 将虚拟机的网络适配器设置为“桥接模式”。此模式下,虚拟机会像独立的物理设备一样接入局域网,并获得宿主机相同的子网 IP 地址。 - **静态 IP 设置** 如果希望手动指定虚拟机的 IP 地址(如 `192.168.1.12`),则需要确保其掩码、默认网关以及 DNS 服务器物理主机一致。例如: ```bash ip addr add 192.168.1.12/24 dev eth0 ip route add default via 192.168.1.1 ``` #### 2. 判断两台机器是否在同一网段 验证虚拟机物理主机是否位于相同网段的关键在于对比它们的网络地址部分。对于 IPv4 地址而言,可通过计算二者的逻辑 AND 运算结果得出所属网段信息[^2]。 假如物理主机 IP 是 `192.168.1.11`,而虚拟机被设定为 `192.168.1.12` 并共享同一个子网掩码 `/24 (255.255.255.0)` ,那么二者确实属于同一网段。 #### 3. 启动并暴露 RAGFlow 的 DeepSeek 服务端口 一旦确认双方处在统一网段之后,接下来就是启动 RAGFlow 中已集成好的 DeepSeek 模型或者 API 接口程序,并开放必要的监听端口号给外部调用者尝试连接。 通常情况下,默认会绑定本地回环接口(`localhost`)运行的服务无法直接跨机器访问;因此修改绑定地址至 `0.0.0.0` 或特定内网 IP 变得尤为重要。以下是 Python Flask 应用的一个简单例子展示如何更改绑定方式: ```python from flask import Flask, jsonify app = Flask(__name__) @app.route('/deepseek', methods=['GET']) def deepseek(): return jsonify({"message": "DeepSeek service is running"}), 200 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) # Bind to all interfaces on port 5000. ``` 上述脚本将 Web 服务公开到了所有可用网络界面之上,意味着只要知道该计算机的有效可达 IP(此处即可能是 `192.168.1.x`) 加上所定义好端口数值就能成功发起请求。 #### 4. 测试连通性和功能验证 最后一步是从另一台客户端测试能否正常抵达目标位置所提供的 RESTful APIs 。利用 curl 命令或者其他 HTTP 客户端工具发送 GET 请求检验返回状态码及数据包内容正确否即可初步判定整个流程搭建完毕。 例如,在终端执行下面命令查看响应情况: ```bash curl http://192.168.1.12:5000/deepseek ``` 如果一切顺利的话应该能看到预期 JSON 结果输出。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忧郁蓝调26

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值