找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1503

积分

0

好友

197

主题
发表于 昨天 02:31 | 查看: 4| 回复: 0

写在前面

我是86年的,今年四十了。过完年,一个同事的经历让我挺受触动,他利用互联网技术帮商家推广,收益很不错。我本想过几年再尝试,但现在觉得,与其空想,不如动手。编程十年,瘾是过足了,接下来打算结合技术,在互联网上做点事。今年的计划就是边协助项目过渡,边在互联网上探索机会。成功没法复制,但首先你得有意识,然后动起来,不断探索,总会有路。


一、技术调试:微信小程序与RAGFlow对接

1. 启动微信小程序

描述:现在接入了知识抽取功能,需要启动微信小程序查看实际效果。

过程记录
启动过程耗时较久,从09:44到10:20,界面响应很慢。第一反应是查看服务器日志,看是否有报错。由于线上服务器状态不佳,决定先在本地环境进行研究。

本地研究
在本地搭建环境,从10:09到11:20,期间尝试运行测试用例,但遇到了报错。
VS Code界面显示RAGFlow测试用例运行错误
图:测试用例执行失败

遇到测试失败时,一个有效的思路是不断缩小测试范围,这样可以更快定位问题根源。当前的问题是测试用例本身无法启动。

尝试绕过测试,直接调用接口
既然测试模块暂时跑不通,就先想办法把服务跑起来,直接用Postman测试接口连通性。
Postman调用Get Dialog接口返回Conversation Not Found
图:Postman调用对话接口成功,但未找到指定会话

接口可以调通,这证明了服务是正常运行的。接下来,需要重点测试 completion 接口,并为其添加日志,以定位响应缓慢的具体环节。

2. 调试Completion接口

描述completion 方法是整个流程的核心,它会先检索知识库,再调用通义千问等大模型生成回答,耗时较长,需要找到优化点。

过程记录

第一步:配置Postman环境变量
为了方便在本地和远程环境间切换,先在Postman中配置了系统变量。
Postman环境变量配置界面
图:配置环境变量用于切换请求地址

第二步:直接调用Completion接口
在Postman中构造请求,直接调用 completion 接口。
Postman调用Completion接口返回JSON解析错误
图:直接调用Completion接口失败,提示JSON解析类型错误

这个请求没有调通,暂时不清楚问题出在哪里。于是改变策略,通过另一个已知可用的 chat_sev 服务来间接调用。

第三步:通过Chat服务间接调用
通过 chat_sev 服务发起请求,成功得到了响应。
通过Chat服务调用专家诊断接口成功
图:通过Chat服务调用成功,但线上响应耗时2分4秒

线上调用一次耗时超过2分钟,这个性能是难以接受的。需要对比线下环境的时间,并进一步分析。既然测试模块现在可以用了,对 completion 的直接调试先暂缓,优先解决另一个基础设施问题。

3. 本地部署Elasticsearch

描述:当前本地RAGFlow连接的是线上ES服务,网络延迟可能影响性能。计划在本地用 Docker 部署一个ES实例,让RAGFlow直连本地,以排除网络因素。

过程记录

第一步:分析部署脚本
项目使用 Docker Compose 管理服务。启动命令如下:

docker compose -f docker-compose.yml up -d

关键文件是 docker-compose.yml,它引入了基础配置:

include:
  - path: ./docker-compose-base.yml
    env_file: ./.env

services:
  ragflow:
    depends_on:
      mysql:
        condition: service_healthy
      es01:
        condition: service_healthy
    image: infiniflow/ragflow:${RAGFLOW_VERSION}
    container_name: ragflow-server
    ports:
      - ${SVR_HTTP_PORT}:9380
      - 18080:80
      - 443:443
      - 5678:5678
    volumes:
      - ./service_conf.yaml:/ragflow/conf/service_conf.yaml
      - ./ragflow-logs:/ragflow/logs
      - ./nginx/ragflow.conf:/etc/nginx/conf.d/ragflow.conf
      - ./nginx/proxy.conf:/etc/nginx/proxy.conf
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - /data/huggingface:/data/huggingface
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    environment:
      - HF_ENDPOINT=${HF_ENDPOINT}
      - HF_TOKEN=${HF_TOKEN}
      - HF_HOME=${HF_HOME}
      - MACOS=${MACOS}
    networks:
      - ragflow
    restart: always

可以看到,RAGFlow服务依赖于 mysqles01 两个服务。其中 es01 的定义在引入的 docker-compose-base.yml 文件中。

第二步:编写精简的ES部署配置
我们不需要启动整个RAGFlow套件,只需单独启动ES。参考 docker-compose-base.yml 中关于 es01 的配置,在本地新建了两个文件。

.env 环境变量文件:

STACK_VERSION=7.10.1
ES_PORT=9200
ELASTIC_PASSWORD=your_password_here

docker-compose.yml 服务定义文件(内容取自基础文件中的 es01 部分):

services:
  es01:
    container_name: ragflow-es-01
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
      - esdata01:/usr/share/elasticsearch/data
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    ports:
      - ${ES_PORT}:9200
    environment:
      - node.name=es01
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - bootstrap.memory_lock=false
      - discovery.type=single-node
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=false
      - xpack.security.transport.ssl.enabled=false
      - ES_JAVA_OPTS=-Xms4g -Xmx4g -XX:ReservedCodeCacheSize=512m
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test: ["CMD-SHELL", "curl http://localhost:9200"]
      interval: 10s
      timeout: 10s
      retries: 120
    networks:
      - ragflow
    restart: always
volumes:
  esdata01:
networks:
  ragflow:

.env与docker-compose.yml文件截图
图:本地创建的部署配置文件

进入文件所在目录 E:\16python\12\ragflow1203\ragflow-project,执行启动命令:

docker-compose up -d

成功拉取并创建了ES镜像。
Docker镜像列表显示Elasticsearch镜像已存在
图:Elasticsearch镜像创建成功

第三步:验证ES服务并修改RAGFlow配置
容器启动后,在浏览器访问 http://localhost:1200(映射端口),输入用户名 elastic 和密码,成功看到ES集群信息,说明服务运行正常。
浏览器访问本地Elasticsearch返回集群信息JSON
图:本地Elasticsearch服务访问成功

接下来,需要修改本地RAGFlow的配置文件 service_conf.yaml,将其ES连接地址从线上改为本地。
RAGFlow配置文件service_conf.yaml,修改ES hosts地址
图:修改配置文件,连接本地ES

第四步:遇到新问题与日志排查
修改配置后重启RAGFlow服务并调用接口,出现了新的错误。
API调用返回508错误,提示ERROR
图:调用接口返回508错误

通过日志分析,初步判断错误与ES连接超时有关。但奇怪的是,浏览器直接访问ES是正常的。深入代码,发现核心的检索逻辑卡在了 self.search 方法上。以下是关键的 retrieval 方法调用:

kbinfos = retr.retrieval(" ".join(questions), embd_mdl, dialog.tenant_id, dialog.kb_ids, 1, dialog.top_n,
                          dialog.similarity_threshold,
                          dialog.vector_similarity_weight,
                          doc_ids=attachments,
                          top=dialog.top_k, aggs=False, rerank_mdl=rerank_mdl)

retrieval 方法内部打日志追踪,发现程序执行到下面这行后,似乎没有进入 self.search 方法内部(因为其内部日志未打印),流程就停滞或异常了。

sres = self.search(req, index_name(tenant_id), embd_mdl, highlight)

Python代码截图,显示retrieval方法及self.search调用处
图:检索方法中的关键代码段

这个问题比较诡异,它可能涉及网络连通性、索引名称映射、认证信息或客户端兼容性,需要后续更细致的调试。关于 RAG 应用的部署和调试,社区里也有很多关于 PythonElasticsearch 集成的最佳实践讨论。

二、Python小练习

描述:实现一个函数,将字符串中的每个空格替换成 “%20”。

示例
输入:s = “We are happy.”
输出:“We%20are%20happy.”

实现
这个练习很简单,直接使用字符串的 replace 方法即可。

s = "We are happy."

def demo(s):
    res = s.replace(' ','%20')
    print(res)

demo(s)

运行测试,结果符合预期。这虽然是一个基础函数,但也考查了对字符串基本操作的理解。
Python代码练习界面,题目为替换字符串中的空格
图:字符串替换练习题目

三、生活随拍与思考

带二宝在家玩的时候抓拍了一张。昨天喝了点酒,反而更清醒,复盘了自己。毅力我是不缺的,能坚持四年多日更公众号就是证明。书也读到了研究生毕业。但我越来越觉得,学历高不等于能力强或智商高。网上有女博士感慨,自己在新西兰做视频搞流量,还干不过一些在家带娃的宝妈。这恰恰说明,内心的驱动力比一纸文凭更重要。一旦真心想做一件事,这个念头本身就是最强的引擎。所以,别多想,心随我动,干就完了。

家中抓拍的生活照
图:生活瞬间

技术的道路就是不断遇到问题、解决问题的循环。每一次调试失败,都是通往更稳定系统的必经之路。如果你也在探索 Docker 部署或者 AI 应用开发,欢迎来 云栈社区 交流分享,共同成长。

《本文完》




上一篇:AWS AI工具Kiro权限失控,自主删除生产环境致服务中断13小时
下一篇:Spring 7.0.4正式发布:修复关键死锁,性能提升超50%,详解40项新特性
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-25 09:10 , Processed in 0.384963 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表