关键字:

ragflow、docker compose、最大token数问题、添加 LLM、configmap、subPath、Ollama

Ollama 可以设置的环境变量包括:
- `OLLAMA_HOST`:定义了 Ollama 监听的网络接口。通过设置`OLLAMA_HOST=0.0.0.0`,可以让 Ollama 监听所有可用的网络接口,从而允许外部网络访问。0.0.0.0:11434
- `OLLAMA_MODELS`:指定了模型镜像的存储路径。D:\ollama直接拷贝文件到该目录后ollama list就可用!
- `OLLAMA_KEEP_ALIVE`:控制模型在内存中的存活时间。设置`OLLAMA_KEEP_ALIVE=24h`可以让模型在内存中保持 24 小时,提高访问速度。
- `OLLAMA_PORT`:允许更改 Ollama 的默认端口。例如,设置`OLLAMA_PORT=8080`可以将服务端口从默认的 11434 更改为 8080。
- `OLLAMA_NUM_PARALLEL`:决定了 Ollama 可以同时处理的用户请求数量。设置`OLLAMA_NUM_PARALLEL=4`可以让 Ollama 同时处理两个并发请求。
- `OLLAMA_MAX_LOADED_MODELS`:限制了 Ollama 可以同时加载的模型数量。设置`OLLAMA_MAX_LOADED_MODELS=4`可以确保系统资源得到合理分配。

***:2024-07-08发布的v0.8.0版本:

  • 2024-07-08 支持 Graph
  • 2024-06-27 Q&A 解析方式支持 Markdown 文件和 Docx 文件。支持提取出 Docx 文件中的图片。支持提取出 Markdown 文件中的表格
  • 2024-06-14 Q&A 解析方式支持 PDF 文件
  • 支持将文件移动到文件管理器中的特定文件夹。

本地WSL/Docker Desktop部署:RAGFlow_docker

1、一共5个镜像:2024/6/13

$ git clone https://github.com/infiniflow/ragflow.git
$ cd ragflow/docker
$ chmod +x ./entrypoint.sh
$ docker compose up -d      #老失败,以下单独拉取
docker pull infiniflow/ragflow:dev      【RAGFLOW_VERSION=dev  10.1GB】
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.11.3  【STACK_VERSION=8.11.3】
docker pull mysql:5.7.18
docker pull quay.io/minio/minio:RELEASE.2023-12-20T01-00-02Z
docker pull redis:7.2.4
  • docker compose up命令(-d:表示以守护进程(后台)模式运行)会根据 docker-compose.yml 文件中定义的服务配置,创建并启动相关的容器,自动下载 RAGFlow 的“开发版本 ”docker 镜像。如果你想下载并运行特定版本的 docker 镜像,在 docker/.env 文件中找到 RAGFLOW_VERSION 变量,将其改为对应版本。例如 RAGFLOW_VERSION=v0.7.0
atc@WIN11-Room208:~$ docker images
REPOSITORY                                            TAG                            IMAGE ID       CREATED        SIZE
infiniflow/ragflow                                    dev                            9fa1045436e3   26 hours ago   29.4GB
swr.cn-north-4.myhuaweicloud.com/infiniflow/ragflow   dev                            9fa1045436e3   26 hours ago   29.4GB
redis                                                 7.2.4                          5a93f6b2e391   2 months ago   173MB
quay.io/minio/minio                                   RELEASE.2023-12-20T01-00-02Z   5702ea361420   5 months ago   206MB
docker.elastic.co/elasticsearch/elasticsearch         8.11.3                         2892d2363c3c   6 months ago   2.19GB
mysql                                                 5.7.18                         d178dffba8d8   6 years ago    575MB

运行后:

atc@WIN11-Room208:~$ docker ps                                                                                                                                                                                               
CONTAINER ID   IMAGE                                                     COMMAND                  CREATED       STATUS                 PORTS                                                              NAMES              
bd77411ab716   swr.cn-north-4.myhuaweicloud.com/infiniflow/ragflow:dev   "./entrypoint.sh"        4 hours ago   Up 4 hours             0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:9380->9380/tcp   ragflow-server     
8ca697b33948   redis:7.2.4                                               "docker-entrypoint.s…"   4 hours ago   Up 4 hours             0.0.0.0:6379->6379/tcp                                             ragflow-redis      
b57e6da21132   quay.io/minio/minio:RELEASE.2023-12-20T01-00-02Z          "/usr/bin/docker-ent…"   4 hours ago   Up 4 hours             0.0.0.0:9000-9001->9000-9001/tcp                                   ragflow-minio      
eb7df0b4d1f9   docker.elastic.co/elasticsearch/elasticsearch:8.11.3      "/bin/tini -- /usr/l…"   4 hours ago   Up 4 hours (healthy)   9300/tcp, 0.0.0.0:1200->9200/tcp                                   ragflow-es-01      
abaeb3b121e0   mysql:5.7.18                                              "docker-entrypoint.s…"   4 hours ago   Up 4 hours (healthy)   0.0.0.0:5455->3306/tcp                                             ragflow-mysql

2、访问: enter http://IP_OF_YOUR_MACHINE, default HTTP serving port 80,随便注册一个账户即可。

http://192.168.1.16:80

3、RAGFlow中模型提供商设置:添加ollama:

  • 宿主机运行Ollama,添加用户环境变量 OLLAMA_HOST:0.0.0.0【Ollama binds 127.0.0.1 port 11434 by default. Change the bind address with the OLLAMA_HOST environment variable.】
  • 模型提供商添加 LLM页面,基础 Url处输入:192.168.1.16:11434/api(or 192.168.1.16:11434 or 192.168.1.16:11434/v1 or 192.168.1.16:11434/v1/api/ 都行!),模型名称:qwen2:7b(下拉框不显示,得输入正确格式)
  • ollama ps命令可以展示当前加载的模型、所占的内存大小以及使用的处理器类型(GPU 或 CPU),Forever和4 minutes from now是模型的有效期。(限制 Ollama 只使用其中的一部分,可以设置 CUDA_VISIBLE_DEVICES 为 GPU 的逗号分隔列表);Install CUDA drivers:CUDA Toolkit 12.5

4、问题:回答大概只有50个字,然后就截断卡掉了。

  • https://demo.ragflow.io/线上的没这个问题,配置除了模型其它都一样;切换多个本地模型测试,应该与模型没关系。
  • 以下这设置了模型输出的最大长度,以标记(单词或单词片段)的数量来衡量。假如设为1,输出更短(1个token),应该生效了。但是设置大了,只输出50个左右就被截断了

本地WSL/Docker Desktop部署:RAGFlow_elasticsearch_02

  • 把上图 “最大token数” 关闭后,正常!
https://github.com/infiniflow/ragflow/blob/v0.7.0/api/db/services/dialog_service.py
def chat(dialog, messages, stream=True, **kwargs):
    assert messages[-1]["role"] == "user", "The last content of this conversation is not from user."
    llm = LLMService.query(llm_name=dialog.llm_id)
    if not llm:
        llm = TenantLLMService.query(tenant_id=dialog.tenant_id, llm_name=dialog.llm_id)
        if not llm:
            raise LookupError("LLM(%s) not found" % dialog.llm_id)
        max_tokens = 1024
    else: max_tokens = llm[0].max_tokens     
    ......
    def message_fit_in(msg, max_length=4000):
    used_token_count, msg = message_fit_in(msg, int(max_tokens * 0.97))
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
    ]

5、yaml 特殊符号语法。涉及的'知识点': configmap资源对象、yaml'|- |+ >'语法 。目的: 彻底解决'YAML 多行文本'格式化'丢失'问题。

本地WSL/Docker Desktop部署:RAGFlow_mysql_03

本地WSL/Docker Desktop部署:RAGFlow_elasticsearch_04

在">"符号应用的'多行文本'值中,所有'换行符'都会被视为'空格'
 
> 右尖括号,用来表示'折叠换行',只有'空白行'才会被识别为'换行',原来的换行符都会被转换成'空格'
 
竖线符'|',这在 yaml 中表示保留换行,每行的'缩进和行尾空白'都会被'去掉',而额外的缩进会被保留
 
"|+": 保留'每行尾部的换行符\n'的同时,'保留'内容结尾处的换行符\n
 
"|-": 保留'每行尾部的换行符\n'的同时,'删除'内容结尾处的换行符\n
 
"|-":保留'行尾'换行符,但不保留'字符末尾'的换行符
 
">+":将行尾换行符'替换'成空格,保留'字符末尾'的换行符
 
">-":将行尾换行符替换成空格,'不保留'字符末尾的换行符
 
换行主要使用 | 和 > , '|'保留行尾'换行符', '>'将行尾换行符替换成'空格'
 
保留字符末尾的换行使用'+',删除字符末尾的换行使用'-',一般用于与'|'和'>'组合使用
 
K8S的yaml文件'只允许'有'空格'

6、docker-compose移植到K8S笔记:

  • RagFlow仅仅是将文件上传(是知识库上传;文件管理上传使用ES[100Gi],然后链接到知识库)至MinIO[20Gi],文件的解析需要手工点击触发,根据文件创建一个或多个异步任务,通过 Redis消息队列进行暂存,方便异步执行。
  • RagFlow使用Elasticsearch存储上传文档数据(是文件管理上传后链接到知识库;知识库上传使用MinIO)、向量数据、任务信息。
  • RagFlow使用MySQL存储:用户信息、系统配置信息(比如配置知识库名称)、任务定义、执行状态、结果等,

6.1、ragflow-mysql:init-file参数在K8S需要加等号。

docker-compose:
    command:
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password
      --tls_version="TLSv1.2,TLSv1.3"
      --init-file /data/application/init.sql

K8S:
        args: 
        - "--max_connections=1000"
        - "--character-set-server=utf8mb4"        
        - "--collation-server=utf8mb4_general_ci"        
        - "--default-authentication-plugin=mysql_native_password"
        - "--tls_version=`TLSv1.2,TLSv1.3`"
        - "--init-file=/data/application/init.sql"

mountPath: /var/lib/mysql 【mysql,rag_flow目录的属主mysql:mysql】(改成mountPath: /var/lib/mysql/rag_flow也一样)后启动失败,注释掉,如下所示OK。

root@ragflow-mysql-67767758d5-t28mt:/var/lib/mysql# pwd
/var/lib/mysql
root@ragflow-mysql-67767758d5-t28mt:/var/lib/mysql# ls
auto.cnf    ca.pem           client-key.pem  ib_logfile0  ibdata1  mysql               private_key.pem  rag_flow         server-key.pem
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile1  ibtmp1   performance_schema  public_key.pem   server-cert.pem  sys

报错STATUS从Error变成CrashLoopBackOff:Back-off restarting failed container mysql;[ERROR] --initialize specified but the data directory has files in it. Aborting.表示初始化 MySQL 数据目录时,发现该目录中已经存在文件,确保运行 MySQL 初始化进程的用户具有对数据目录的适当读写权限。

[root@k8s-master01 yaml]# k -n ragflow get pod -owide
NAME                             READY STATUS                     
ragflow-mysql-5d8db678c7-559ww   0/1   Error->CrashLoopBackOff    
# k -n ragflow describe pod ragflow-mysql-5d8db678c7-559ww
    State:          Terminated
      Reason:       Error
      Exit Code:    1
Events:
  Type     Reason                  Age               From                     Message
  ----     ------                  ----              ----                     -------
  Normal   Scheduled               23s               default-scheduler        Successfully assigned ragflow/ragflow-mysql-5d8db678c7-559ww to k8s-node06
  Normal   SuccessfulAttachVolume  23s               attachdetach-controller  AttachVolume.Attach succeeded for volume "pvc-0511cbe3-bbea-4663-b53e-1940a51412bc"
  Normal   Pulled                  5s (x3 over 21s)  kubelet                  Container image "core.harbor.domain/mizy/mysql:5.7.18" already present on machine
  Normal   Created                 5s (x3 over 21s)  kubelet                  Created container mysql
  Normal   Started                 4s (x3 over 20s)  kubelet                  Started container mysql
  Warning  BackOff                 3s (x3 over 17s)  kubelet                  Back-off restarting failed container mysql in pod ragflow-mysql-5d8db678c7-559ww_ragflow(54458dba-d327-4c1d-81fa-53b6721dd767)  
  [root@k8s-master01 yaml]# k -n ragflow logs ragflow-mysql-5d8db678c7-559ww
Initializing database
2024-06-25T13:18:17.359396Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2024-06-25T13:18:17.362660Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
2024-06-25T13:18:17.362695Z 0 [ERROR] Aborting

mountPath: /var/lib/mysql 持久化该目录后,目录里内容少了,说明是挂载该目录的问题。

root@ragflow-mysql-54866bf5db-72ck2:/var/lib/mysql# pwd
/var/lib/mysql
root@ragflow-mysql-54866bf5db-72ck2:/var/lib/mysql# ls
auto.cnf  ib_buffer_pool  ib_logfile0  ib_logfile1  ibdata1  lost+found
  • 按以下加了subPath好了!!!
volumeMounts:
        - name: ragflow-mysql
          mountPath: /var/lib/mysql
          subPath: mysql

6.2、ragflow-minio:k8s命令需要加minio(docker-compose没有minio,直接是server),即minio server --console-address ':9001' /data

docker-compose:
   command: server --console-address ":9001" /data
k8s:
        command: ["/bin/sh","-c","--"]
        args: ["minio server --console-address ':9001' /data"]

6.3、Deployment的containerPort和Service的targetPort端口号保持一致(这里通过name引用)。流量通过 Service 的 targetPort 转发到对应的后端Pod的containerPort; port是Service暴露在ClusterIP 上的端口。