写在前面
我是86年的,今年四十了。过完年,一个同事的经历让我挺受触动,他利用互联网技术帮商家推广,收益很不错。我本想过几年再尝试,但现在觉得,与其空想,不如动手。编程十年,瘾是过足了,接下来打算结合技术,在互联网上做点事。今年的计划就是边协助项目过渡,边在互联网上探索机会。成功没法复制,但首先你得有意识,然后动起来,不断探索,总会有路。
一、技术调试:微信小程序与RAGFlow对接
1. 启动微信小程序
描述:现在接入了知识抽取功能,需要启动微信小程序查看实际效果。
过程记录:
启动过程耗时较久,从09:44到10:20,界面响应很慢。第一反应是查看服务器日志,看是否有报错。由于线上服务器状态不佳,决定先在本地环境进行研究。
本地研究:
在本地搭建环境,从10:09到11:20,期间尝试运行测试用例,但遇到了报错。

图:测试用例执行失败
遇到测试失败时,一个有效的思路是不断缩小测试范围,这样可以更快定位问题根源。当前的问题是测试用例本身无法启动。
尝试绕过测试,直接调用接口:
既然测试模块暂时跑不通,就先想办法把服务跑起来,直接用Postman测试接口连通性。

图:Postman调用对话接口成功,但未找到指定会话
接口可以调通,这证明了服务是正常运行的。接下来,需要重点测试 completion 接口,并为其添加日志,以定位响应缓慢的具体环节。
2. 调试Completion接口
描述:completion 方法是整个流程的核心,它会先检索知识库,再调用通义千问等大模型生成回答,耗时较长,需要找到优化点。
过程记录:
第一步:配置Postman环境变量
为了方便在本地和远程环境间切换,先在Postman中配置了系统变量。

图:配置环境变量用于切换请求地址
第二步:直接调用Completion接口
在Postman中构造请求,直接调用 completion 接口。

图:直接调用Completion接口失败,提示JSON解析类型错误
这个请求没有调通,暂时不清楚问题出在哪里。于是改变策略,通过另一个已知可用的 chat_sev 服务来间接调用。
第三步:通过Chat服务间接调用
通过 chat_sev 服务发起请求,成功得到了响应。

图:通过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服务依赖于 mysql 和 es01 两个服务。其中 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:

图:本地创建的部署配置文件
进入文件所在目录 E:\16python\12\ragflow1203\ragflow-project,执行启动命令:
docker-compose up -d
成功拉取并创建了ES镜像。

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

图:本地Elasticsearch服务访问成功
接下来,需要修改本地RAGFlow的配置文件 service_conf.yaml,将其ES连接地址从线上改为本地。

图:修改配置文件,连接本地ES
第四步:遇到新问题与日志排查
修改配置后重启RAGFlow服务并调用接口,出现了新的错误。

图:调用接口返回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)

图:检索方法中的关键代码段
这个问题比较诡异,它可能涉及网络连通性、索引名称映射、认证信息或客户端兼容性,需要后续更细致的调试。关于 RAG 应用的部署和调试,社区里也有很多关于 Python 和 Elasticsearch 集成的最佳实践讨论。
二、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)
运行测试,结果符合预期。这虽然是一个基础函数,但也考查了对字符串基本操作的理解。

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

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