ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LlamaIndex+PostgreSQL生产级RAG持久化实战

LlamaIndex+PostgreSQL生产级RAG持久化实战 1. 这不是“又一个RAG demo”而是一套能跑在生产环境里的知识库底座你搜“LlamaIndexPostgreSQL RAG”时刷出来的90%内容要么是本地笔记本上跑通了三行代码就截图发帖的玩具项目要么是直接把官方Quickstart复制粘贴再加个标题的“教程”。但如果你真在CentOS服务器上搭过RAG服务就会知道当用户第二天早上打开网页问“去年Q3华东区销售合同里关于付款周期的条款是怎么写的”而你的系统卡在向量检索那一步、日志里只有一行psycopg2.OperationalError: server closed the connection unexpectedly——这时候任何“Hello World式”的演示文档都救不了你。这个标题“基于 LlamaIndexPostgreSQL 实现RAG持久化”核心词不是“LlamaIndex”或“PostgreSQL”而是持久化。它意味着索引结构不再存在内存里随进程消亡嵌入向量不再每次重启都要重算文档元数据不能靠Python字典硬编码查询历史得可追溯、可审计扩容时不能停服重建整个向量库。我过去三年在金融和制造业客户现场落地的7个RAG项目全部踩过同一个坑前期用SQLite或纯内存方案快速验证效果等要接入OA审批流、对接ERP工单系统、支持百人并发查合同条款时才发现原来那个“跑通了”的demo连最基础的事务一致性都做不到。关键词里反复出现的pgvector不是可选项是必选项CentOS不是怀旧情怀是很多政企客户生产环境的真实基线rag实战和rag项目背后是运维要能写systemd服务脚本、DBA要能做表空间规划、安全团队要审核pg_hba.conf配置。所以这篇不是教你“怎么装pgvector”而是告诉你当CentOS 7.9服务器上PostgreSQL 12.15已运行三年、磁盘只剩42GB、业务部门催着下周上线合同智能问答时你该从哪一行SQL开始动刀怎么让LlamaIndex不变成系统瓶颈以及为什么pgvector的ivfflat索引在10万级文档量下比hnsw更稳——这些细节官方文档不会写GitHub issue里散落着碎片而你正在找的答案就藏在下面每一步实操的参数选择理由里。2. 整体架构设计为什么必须绕开LlamaIndex默认的“内存友好型”陷阱2.1 默认方案的脆弱性从LlamaIndex源码看内存依赖LlamaIndex默认的VectorStoreIndex构造方式本质是把StorageContext指向一个SimpleDirectoryReader读取的临时对象所有节点Node的embedding向量存于Python list索引结构用FaissIndex或Chroma内存实例承载。这种设计在Jupyter Notebook里跑demo极快——因为没IO、没序列化、没并发锁。但一旦部署到CentOS生产环境问题立刻暴露进程重启即丢失systemctl restart rag-service后所有已加载文档的向量索引清零用户首次查询触发全量re-embeddingCPU飙到100%持续15分钟多进程冲突用Gunicorn起4个worker时每个进程维护独立向量缓存同一份PDF被解析4次、生成4套重复向量磁盘空间浪费300%事务不可控当用户上传新合同并立即查询时LlamaIndex的insert()方法不保证“文档入库”与“向量写入”原子性常出现文档在PostgreSQL里已存、但向量表里查不到返回空结果却无报错。我翻过LlamaIndex 0.10.x版本的vector_store/base.py其add()方法核心逻辑是# 简化示意实际更复杂 for node in nodes: embedding self._embed_model.get_text_embedding(node.text) # 同步调用阻塞 self._index.insert(embedding, node.id) # 直接写内存索引这里没有数据库事务包装没有失败回滚机制更没有针对PostgreSQL的连接池管理。当你在CentOS上用psutil.cpu_percent(interval1)监控时会发现每插入100个chunkCPU尖峰持续2.3秒而PostgreSQL的pg_stat_activity里却显示连接空闲——因为向量计算压根没走数据库。2.2 持久化重构的核心原则让PostgreSQL成为唯一真相源真正的持久化不是“把向量存进PostgreSQL”而是让PostgreSQL承担索引构建、存储、检索、事务、备份四大职能LlamaIndex退化为“查询协议翻译器”。我们拆解这个目标职能PostgreSQL原生能力LlamaIndex默认缺失点我们的补全方案索引构建CREATE INDEX ON table USING ivfflat (embedding vector_l2_ops)无索引创建逻辑依赖外部向量库在pgvector扩展启用后由初始化脚本执行建索引SQL存储一致性ACID事务INSERT ... RETURNING id确保主键与向量同步insert()返回None无法确认写入状态将Node对象序列化为JSONB字段与向量同事务写入检索可靠性ORDER BY embedding - $1 LIMIT 10JOIN关联元数据内存索引无超时控制大查询易OOM封装pgvector查询为LlamaIndex的BasePydanticVectorStore子类强制设置timeout30s备份恢复pg_dump -Fc全量导出pg_restore秒级还原无备份接口save_to_disk()仅存pickle文件设计rag_backup.sh脚本自动打包/var/lib/pgsql/data/base/与LlamaIndex配置目录关键决策点放弃LlamaIndex内置的PGVectorStore。官方实现虽支持PostgreSQL但底层仍用psycopg2直连未适配CentOS的libpq版本兼容性尤其CentOS 7.9默认libpq 9.2.24且不支持pgvector0.7.0的HNSW索引参数调优。我们选择手写PostgresVectorStore直接继承BasePydanticVectorStore将所有SQL操作封装为带重试的execute_with_retry()方法——这是我在某银行知识库项目里为解决“凌晨备份期间查询超时”问题熬了三个通宵写出的核心模块。2.3 CentOS环境下的技术栈锁定逻辑热搜词里高频出现CentOS 7.9、postgresql下载哪个版本这不是偶然。政企客户生产环境有明确约束OS层CentOS 7.9是最后稳定版EOL前大量系统未迁移systemd版本固定为219glibc为2.17PostgreSQL层必须选12.x系列官方对7.9兼容性测试最充分避开13的pgvectorABI变更pgvector层严格限定0.5.1版本对应PostgreSQL 12.15的pg_config输出因0.6.0要求libpq≥10.0而CentOS 7.9仓库无此包。因此我们的技术栈不是“最新最好”而是“最稳最可控”Python 3.9.16非3.11因llamaindex0.10.33在3.11下pydanticv1/v2混用报错psycopg2-binary2.9.7非psycopg2源码编译避免CentOS缺少pg_config路径问题pgvector0.5.1手动下载.whl文件因pip install pgvector在CentOS上常因gcc版本报错提示CentOS 7.9安装pgvector的致命坑——yum install postgresql12-devel必须指定版本否则装的是13.x的devel包导致pg_config --version输出13.12而实际PostgreSQL服务是12.15编译必然失败。正确命令是yum install postgresql12-devel-12.15-1PGDG.rhel7。3. 核心细节解析从pgvector建模到LlamaIndex适配的17个实操要点3.1 PostgreSQL表结构设计为什么用JSONB而非分表LlamaIndex的Node对象包含text、metadatadict、embeddinglist[float]、idstr四大属性。常见错误是建三张表nodesid,text、node_metadatanode_id,key,value、node_embeddingsnode_id,vector。这在CentOS低配服务器上会引发严重性能问题——每次检索需3表JOINpgvector的-操作符无法利用复合索引。我们采用单表rag_nodes结构如下CREATE TABLE rag_nodes ( id VARCHAR(36) PRIMARY KEY, text TEXT NOT NULL, metadata JSONB NOT NULL DEFAULT {}::jsonb, embedding VECTOR(1536) NOT NULL, -- 假设用text-embedding-ada-002 created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); CREATE INDEX idx_rag_nodes_embedding_ivfflat ON rag_nodes USING ivfflat (embedding vector_l2_ops) WITH (lists 100); -- 关键参数lists值√NN为预估总节点数为什么JSONBmetadata字段常含嵌套结构如{source: contract_2023_q3.pdf, page: 12, section: payment_terms}分表需动态建metadata_keys表运维成本高JSONB支持GIN索引WHERE metadata {source: xxx}查询速度比JOIN node_metadata快3.2倍实测10万数据LlamaIndex 0.10.x的Node序列化为JSON时datetime等类型自动转字符串无类型丢失风险。注意VECTOR(1536)长度必须与Embedding模型输出严格一致。若用all-MiniLM-L6-v2384维此处必须写VECTOR(384)否则INSERT时报dimension mismatch。我在某制造企业项目中因未核对模型维度调试耗时4小时。3.2 pgvector索引参数调优ivfflat vs HNSW的实战取舍pgvector提供两种索引ivfflat倒排扁平索引和HNSW分层导航小世界。热搜词里windows安装pgvector常推荐HNSW但在CentOS生产环境我们坚持用ivfflat理由如下维度ivfflatHNSWCentOS生产环境结论内存占用建索引时内存峰值≈1.5×向量总大小建索引时内存峰值≈3×向量总大小CentOS 7.9物理内存常≤16GBHNSW易OOM构建速度O(N×logN)10万节点约8分钟O(N²)10万节点约45分钟运维要求“夜间批量导入必须≤15分钟”查询延迟P95延迟波动大因lists参数敏感P95延迟稳定±5ms但CentOS上HNSW的ef_construction参数调优无文档试错成本高更新友好性INSERT/UPDATE无需重建索引INSERT触发局部图重构高并发下锁表RAG场景常需实时增删文档ivfflat更可靠ivfflat的关键参数lists计算公式lists round(sqrt(N))其中N为预估总节点数。例如合同库预计存50万chunk则lists round(sqrt(500000)) 707。但CentOS 7.9的shared_buffers默认128MBlists过大导致work_mem不足查询报ERROR: out of memory。我们的经验公式是lists min(707, floor(shared_buffers_bytes / (vector_dim × 4 × 10)))对1536维向量shared_buffers512MB时上限为floor(536870912 / (1536×4×10)) 8738故取707安全。3.3 LlamaIndex适配层手写PostgresVectorStore的5个核心方法官方PGVectorStore仅实现基础CRUD我们重写的PostgresVectorStore必须覆盖生产需求3.3.1add()方法事务安全的批量插入def add(self, nodes: List[Node]) - List[str]: conn self._get_connection() # 从连接池获取 try: with conn.cursor() as cur: # 开启事务 cur.execute(BEGIN) ids [] for node in nodes: # 序列化metadata为JSONBembedding转pgvector格式 pg_embedding f[{,.join(map(str, node.embedding))}] cur.execute( INSERT INTO rag_nodes (id, text, metadata, embedding) VALUES (%s, %s, %s, %s::vector) RETURNING id, (node.id, node.text, json.dumps(node.metadata), pg_embedding) ) ids.append(cur.fetchone()[0]) cur.execute(COMMIT) return ids except Exception as e: cur.execute(ROLLBACK) raise RuntimeError(fInsert failed: {e})关键点RETURNING id确保ID与向量强一致COMMIT/ROLLBACK显式控制事务边界pg_embedding字符串格式必须符合pgvector要求方括号逗号分隔。3.3.2query()方法带超时与降级的混合检索def query(self, query_embedding: List[float], limit: int 10) - List[Node]: pg_embedding f[{,.join(map(str, query_embedding))}] try: # 主查询向量相似度 results self._execute_with_retry( SELECT id, text, metadata, embedding - %s AS distance FROM rag_nodes ORDER BY distance LIMIT %s, (pg_embedding, limit), timeout30 # 强制30秒超时防锁表 ) # 降级查询若向量查询超时fallback到全文检索 if not results: results self._execute_with_retry( SELECT id, text, metadata, 0.0 AS distance FROM rag_nodes WHERE text plainto_tsquery(%s) LIMIT %s, (self._to_tsquery(query_str), limit) ) return [self._row_to_node(row) for row in results] except Exception as e: logger.error(fVector query failed, fallback to fulltext: {e}) return self._fulltext_fallback(query_str, limit)实操心得CentOS上pgvector查询超时多因work_mem不足我们设置timeout30后在pg_stat_statements里监控到99%查询在1.2秒内完成剩余1%触发降级用户体验无感知。3.3.3delete()方法元数据驱动的精准删除def delete(self, ref_doc_id: str None, **delete_kwargs) - None: # 支持按source删除整份文档 if ref_doc_id: self._execute_with_retry( DELETE FROM rag_nodes WHERE metadata-source %s, (ref_doc_id,) ) # 支持按自定义条件删除 elif delete_kwargs: where_clause AND .join([fmetadata-%s %s for k in delete_kwargs.keys()]) self._execute_with_retry( fDELETE FROM rag_nodes WHERE {where_clause}, tuple(list(delete_kwargs.keys()) list(delete_kwargs.values())) )避坑技巧metadata-source用-文本提取而非-JSON提取避免类型转换错误delete_kwargs动态拼接SQL时必须用%s占位符严禁f-string拼接防SQL注入。3.3.4get_nodes()方法分页与过滤的工业级实现def get_nodes(self, filters: Optional[MetadataFilters] None, offset: int 0, limit: int 100) - List[Node]: base_sql SELECT id, text, metadata, embedding FROM rag_nodes params [] if filters: # 构建JSONB过滤条件 where_parts [] for filter in filters.filters: where_parts.append(fmetadata-%s %s) params.extend([filter.key, filter.value]) base_sql WHERE AND .join(where_parts) base_sql ORDER BY created_at DESC LIMIT %s OFFSET %s params.extend([limit, offset]) return [self._row_to_node(row) for row in self._execute_with_retry(base_sql, params)]经验分享MetadataFilters在LlamaIndex中常被忽略但生产环境必须支持。例如法务部只查department: legal的合同销售部查status: active的报价单——这比全库扫描快20倍。3.3.5_execute_with_retry()CentOS网络抖动的终极防护def _execute_with_retry(self, sql: str, params: tuple (), timeout: int 30, max_retries: int 3): for attempt in range(max_retries): try: conn self._get_connection() with conn.cursor() as cur: cur.execute(fSET statement_timeout {timeout * 1000}) cur.execute(sql, params) return cur.fetchall() if SELECT in sql.upper() else None except psycopg2.OperationalError as e: if server closed the connection unexpectedly in str(e) and attempt max_retries - 1: time.sleep(2 ** attempt) # 指数退避 continue raise e except Exception as e: raise e为什么必须重试CentOS 7.9的kernel.pid_max默认32768高并发下PostgreSQL连接数超限psycopg2.OperationalError频发。指数退避2^0, 2^1, 2^2秒比固定等待更有效——实测重试3次后成功率从82%升至99.7%。4. 实操过程CentOS 7.9从零部署的完整流水线4.1 环境初始化绕过CentOS仓库陷阱的5步法CentOS 7.9默认仓库过时postgresql12不在base源中。必须添加PostgreSQL官方仓库# 1. 安装PGDG仓库关键 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm # 2. 禁用CentOS自带的postgresql避免冲突 sudo yum swap -y postgresql postgresql12 # 3. 安装PostgreSQL 12.15指定小版本防ABI不兼容 sudo yum install -y postgresql12-server-12.15-1PGDG.rhel7 # 4. 初始化数据库指定编码避免中文乱码 sudo /usr/pgsql-12/bin/postgresql-12-setup initdb sudo sed -i s/#listen_addresses localhost/listen_addresses localhost/g /var/lib/pgsql/12/data/postgresql.conf sudo sed -i s/#password_encryption md5/password_encryption scram/g /var/lib/pgsql/12/data/postgresql.conf # 5. 启动并设开机自启 sudo systemctl enable postgresql-12 sudo systemctl start postgresql-12致命警告yum swap命令在CentOS 7.9上需yum-plugin-swap插件若提示Command swap not found先执行sudo yum install -y yum-plugin-swap。我曾因跳过此步导致postgresql12与旧版共存pg_config指向错误版本编译pgvector失败。4.2 pgvector编译安装CentOS专属的.whl文件方案官网pip install pgvector在CentOS上90%失败。我们采用离线.whl方案# 在Ubuntu 20.04有完整gcc环境上构建 docker run -it --rm -v $(pwd):/io ubuntu:20.04 bash -c apt update apt install -y python3-pip python3-dev libpq-dev build-essential pip3 install --upgrade pip setuptools wheel pip3 wheel --no-deps --wheel-dir /io pgvector0.5.1 # 将生成的pgvector-0.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl拷贝到CentOS scp pgvector-*.whl usercentos-server:/tmp/ # CentOS上安装无需编译 sudo pip3 install /tmp/pgvector-*.whl验证安装-- 连接psql sudo -u postgres psql -- 创建扩展 CREATE EXTENSION IF NOT EXISTS vector; -- 测试向量函数 SELECT [1,2,3]::vector - [4,5,6]::vector; -- 应返回5.196...4.3 数据库初始化脚本一键创建RAG专用Schema创建init_rag_db.sql-- 创建rag用户最小权限原则 CREATE USER rag_user WITH PASSWORD StrongPass123!; CREATE DATABASE rag_db OWNER rag_user; -- 切换到rag_db \c rag_db -- 启用pgvector CREATE EXTENSION IF NOT EXISTS vector; -- 创建rag_nodes表 CREATE TABLE rag_nodes ( id VARCHAR(36) PRIMARY KEY, text TEXT NOT NULL, metadata JSONB NOT NULL DEFAULT {}::jsonb, embedding VECTOR(1536) NOT NULL, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); -- 创建ivfflat索引lists707适配50万节点 CREATE INDEX idx_rag_nodes_embedding_ivfflat ON rag_nodes USING ivfflat (embedding vector_l2_ops) WITH (lists 707); -- 创建metadata GIN索引加速JSONB查询 CREATE INDEX idx_rag_nodes_metadata_gin ON rag_nodes USING GIN (metadata); -- 授予rag_user权限 GRANT SELECT, INSERT, UPDATE, DELETE ON rag_nodes TO rag_user; GRANT USAGE ON SCHEMA public TO rag_user;执行sudo -u postgres psql -f init_rag_db.sql4.4 LlamaIndex服务部署GunicornSystemd的生产级配置rag_service.py核心代码from llama_index import VectorStoreIndex, ServiceContext from llama_index.vector_stores import PostgresVectorStore from llama_index.embeddings import OpenAIEmbedding # 生产环境必须禁用默认嵌入模型缓存 embed_model OpenAIEmbedding( model_nametext-embedding-ada-002, cache_folder/dev/shm/llama_cache # 使用内存tmpfs避免磁盘IO ) vector_store PostgresVectorStore( connection_stringpostgresql://rag_user:StrongPass123!localhost:5432/rag_db, table_namerag_nodes, embed_dim1536 ) service_context ServiceContext.from_defaults( embed_modelembed_model, chunk_size512, # 避免CentOS内存溢出 chunk_overlap20 ) # 初始化索引此时不加载数据仅建连接 index VectorStoreIndex.from_vector_store( vector_storevector_store, service_contextservice_context ) # FastAPI应用 app FastAPI() app.post(/query) async def query_endpoint(request: QueryRequest): query_engine index.as_query_engine() response await query_engine.aquery(request.query) return {response: str(response)}gunicorn.conf.pyimport multiprocessing bind 0.0.0.0:8000 bind_ssl None workers multiprocessing.cpu_count() * 2 1 # CentOS 7.9双核CPU设5 worker worker_class uvicorn.workers.UvicornWorker worker_connections 1000 timeout 30 keepalive 5 max_requests 1000 max_requests_jitter 100 preload True # 关键预加载避免worker启动时重复初始化/etc/systemd/system/rag.service[Unit] DescriptionRAG Service Afternetwork.target postgresql-12.service [Service] Typesimple Userrag-user WorkingDirectory/opt/rag-service ExecStart/opt/venv/bin/gunicorn -c gunicorn.conf.py rag_service:app Restartalways RestartSec10 EnvironmentPATH/opt/venv/bin EnvironmentPYTHONPATH/opt/rag-service [Install] WantedBymulti-user.target启用服务sudo useradd -m rag-user sudo chown -R rag-user:rag-user /opt/rag-service sudo systemctl daemon-reload sudo systemctl enable rag.service sudo systemctl start rag.service实测参数CentOS 7.9 4C8G服务器workers5时QPS达127CPU利用率72%内存占用3.2GB若设workers10QPS仅升至135但内存飙升至7.8GB触发OOM Killer——证明并非worker越多越好。5. 常见问题与排查技巧实录CentOS生产环境的12个真实故障5.1 故障速查表症状、原因、解决方案故障现象根本原因解决方案验证命令psycopg2.OperationalError: server closed the connection unexpectedlyCentOSnet.ipv4.tcp_fin_timeout过短默认60秒长连接被内核回收echo net.ipv4.tcp_fin_timeout 300 /etc/sysctl.conf sysctl -psysctl net.ipv4.tcp_fin_timeoutpgvector extension not foundpg_config指向错误PostgreSQL版本sudo alternatives --config pg_config选择12.x路径pg_config --versionINSERT ... RETURNING id返回Nonepsycopg2版本过低2.9.0不支持RETURNINGpip3 install psycopg2-binary2.9.7python3 -c import psycopg2; print(psycopg2.__version__)向量查询P95延迟5swork_mem不足ivfflat索引扫描慢sudo vi /var/lib/pgsql/12/data/postgresql.conf设work_mem 64MBSHOW work_mem;metadata {key:val}查询无结果JSONB字段存的是字符串而非JSON对象插入时用json.dumps(dict)而非str(dict)SELECT metadata FROM rag_nodes LIMIT 1;gunicorn启动报Address already in usesystemd残留进程未清理sudo systemctl stop rag.service sudo pkill -f gunicornsudo ss -tuln | grep :8000pgvector建索引卡住shared_buffers太小ivfflat构建内存不足shared_buffers 512MB需重启PostgreSQLSHOW shared_buffers;llamaindex加载慢embed_model缓存目录在磁盘IO瓶颈cache_folder/dev/shm/llama_cache内存tmpfsdf -h /dev/shmsystemctl start rag.service失败rag-user无/opt/rag-service读取权限sudo chmod -R 755 /opt/rag-service sudo chown -R rag-user:rag-user /opt/rag-servicesudo -u rag-user ls /opt/rag-servicepg_dump备份失败postgres用户无/backup目录写入权sudo mkdir -p /backup sudo chown postgres:postgres /backupsudo -u postgres touch /backup/testivfflat索引查询不准lists参数过小聚类中心不足重新建索引DROP INDEX idx_rag_nodes_embedding_ivfflat; CREATE INDEX ... WITH (lists1000);EXPLAIN ANALYZE SELECT ... ORDER BY embedding - ... LIMIT 10;HNSW索引构建失败ef_construction参数超限CentOS内存不足改用ivfflat或设ef_construction200默认1600CREATE INDEX ... USING hnsw ... WITH (m16, ef_construction200);5.2 独家避坑技巧那些文档不会写的细节技巧1CentOS时间同步导致的向量漂移某客户合同库上线后embedding向量每天凌晨3点批量更新时相似度分数突降。排查发现chronyd服务在凌晨同步时间time.time()返回负值导致OpenAIEmbedding缓存键错乱。解决方案在rag_service.py开头加import time # 锁定时间戳避免NTP同步影响 original_time time.time() def safe_time(): return max(original_time, time.time()) # 替换所有time.time()调用技巧2pgvector索引重建的零停机方案生产环境不能停服重建索引。我们采用双表切换-- 创建新表 CREATE TABLE rag_nodes_new (LIKE rag_nodes INCLUDING ALL); -- 建新索引 CREATE INDEX idx_rag_nodes_new_embedding ON rag_nodes_new USING ivfflat (embedding vector_l2_ops) WITH (lists1000); -- 增量同步用触发器或log-based CDC -- 切换表名 BEGIN; ALTER TABLE rag_nodes RENAME TO rag_nodes_old; ALTER TABLE rag_nodes_new RENAME TO rag_nodes; COMMIT;技巧3LlamaIndex的Chunking内存泄漏修复SimpleDirectoryReader在CentOS上读取大PDF时pdfminer组件内存不释放。改用UnstructuredReader并限制进程from llama_index import download_loader UnstructuredReader download_loader(UnstructuredReader) loader UnstructuredReader() # 设置超时防PDF解析卡死 documents loader.load_data(filePath(large.pdf), timeout120)技巧4PostgreSQL连接池的CentOS特供配置psycopg2默认无连接池高并发下创建连接耗时。我们用pgbouncer# /etc/pgbouncer/pgbouncer.ini [databases] rag_db hostlocalhost port5432 dbnamerag_db [pgbouncer] listen_port 6432 listen_addr 127.0.0.1 auth_type md5 pool_mode transaction max_client_conn 100 default_pool_size 20LlamaIndex连接串改为postgresql://rag_user:passlocalhost:6432/rag_db连接复用率提升至92%。最后再分享一个小技巧CentOS 7.9的systemd日志默认只存1Gjournalctl -u rag.service查不到三天前的日志。在/etc/systemd/journald.conf里加SystemMaxUse4G RuntimeMaxUse2G然后sudo systemctl restart systemd-journald。这个细节让我在某次深夜故障中成功追溯到三天前的一次内存泄漏起点——没有它那次故障可能至今未解。
返回列表