-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path.env.example
More file actions
272 lines (247 loc) · 10.9 KB
/
.env.example
File metadata and controls
272 lines (247 loc) · 10.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
# ==========================================
# 核心系统配置 (Application Config)
# ==========================================
APP_HOST=0.0.0.0
APP_PORT=8000
LOG_LEVEL=INFO
APP_ENV=development
# 日志文件落盘(对齐 Java 端:logs/<YYYY-MM-DD>/<service>.log + <service>-error.log)
# 每天 0 点切分,保留 LOG_RETENTION_DAYS 天
# Docker 部署下保持 LOG_DIR=logs(相对路径,容器内为 /app/logs),由
# deploy/docker-compose.yml 的 ../logs:/app/logs 持久化到宿主机;改成绝对路径会绕开挂载。
LOG_FILE_ENABLED=true
LOG_DIR=logs
LOG_SERVICE_NAME=tolink-service
LOG_RETENTION_DAYS=7
# ==========================================
# 存储 & 缓存配置 (Storage & Cache)
# ==========================================
# Database (MySQL)
DB_HOST=43.138.176.52
DB_PORT=3306
DB_USER=root
DB_PASSWORD=your_db_password
DB_NAME=tolink_rag_db
# Redis (用于共享下发的用户 LLM 缓存与配置)
REDIS_HOST=43.138.176.52
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASSWORD=your_redis_password
# ==========================================
# 安全配置 (Security)
# ==========================================
# 【关键】用于解密从数据库 llm_user_config 表取出的 API Key 密文
# 需要与 Java 管理端的 AES/GCM Secret 保持完全一致:64 位 hex,解码后 32 字节
# 下方为本地占位示例,生产必须覆盖
API_KEY_ENCRYPTION_SECRET=0000000000000000000000000000000000000000000000000000000000000000
# ==========================================
# 系统级兜底 LLM 配置 (Platform Default Fallback LLMs)
# ==========================================
# 如果系统没有查到用户的可用额度,或者是在系统内部后台工作流中使用,会触发以下系统级的全局兜底调用
SYSTEM_LLM_PROVIDER=qwen
SYSTEM_LLM_API_KEY=your_qwen_api_key_here
SYSTEM_LLM_API_BASE=https://dashscope.aliyuncs.com/compatible-mode/v1
SYSTEM_LLM_MODEL_CHAT=qwen3.5-flash
SYSTEM_LLM_MODEL_EMBEDDING=text-embedding-v4
# RERANK 不走系统兜底,必须由用户在 RERANK 能力配置里指定 provider + rerank 模型
# (如 provider=openai + api_base=硅基流动 + model=BAAI/bge-reranker-v2-m3),故此处留空。
SYSTEM_LLM_MODEL_RERANK=
SYSTEM_LLM_MODEL_VISION=qwen-vl-max
MARKDOWN_PARSER_ENABLE_TABLE_ENHANCEMENT=true
MARKDOWN_PARSER_ENABLE_IMAGE_ENHANCEMENT=true
MARKDOWN_PARSER_TABLE_MODEL=
MARKDOWN_PARSER_VISION_MODEL=
MARKDOWN_PARSER_LLM_TIMEOUT_MS=60000
MARKDOWN_PARSER_VISION_CONCURRENCY=24
CHUNKING_HEADING_BREAK_LEVEL=5
CHUNKING_MIN_CANDIDATE_CHUNK_TOKENS=128
CHUNKING_SEMANTIC_PERCENTILE=95
CHUNKING_SEMANTIC_UNIT=sentence
CHUNKING_MIN_CHUNK_TOKENS=150
CHUNKING_MAX_CHUNK_TOKENS=512
# overlap token 数允许范围:0-64;0 表示关闭 overlap
CHUNKING_OVERLAP_TOKENS=64
CHUNKING_MIN_DISTANCE_GATE=0.25
CHUNKING_EMBED_BATCH_SIZE=32
# ==========================================
# 存储 & 资源配置 (Storage & Resources)
# ==========================================
# 向量数据库选择 (Vector Store Selection)
# 可选值: qdrant / elasticsearch
VECTOR_STORE_TYPE=qdrant
# --- Qdrant 配置 ---
QDRANT_HOST=43.138.176.52
QDRANT_PORT=6333
QDRANT_GRPC_PORT=6334
QDRANT_COLLECTION_NAME=tolink_rag_collection
QDRANT_API_KEY=
QDRANT_TIMEOUT_SECONDS=5
# --- Chunk 向量存储配置 ---
CHUNK_INDEX_BUCKET_COUNT=128
CHUNK_INDEX_COLLECTION_PREFIX=kb_bucket
CHUNK_INDEX_EMBED_BATCH_SIZE=32
# CHUNK_INDEX_EMBED_BATCH_SIZE 是单次 embedding API 请求携带的文本条数上限,
# 不是总向量化数量上限。实际值会被 provider 已知上限自动 cap(如 DashScope text-embedding-v4 上限为 10)。
CHUNK_INDEX_RETRY_LIMIT=3
CHUNK_INDEX_RETRY_INTERVAL_SECONDS=300
CHUNK_INDEX_INDEXING_STALE_SECONDS=900
# --- 真实环境集成测试开关 ---
# 置为 true 后,pytest 会执行真实 MySQL + Qdrant 的向量存储冒烟测试。
TOLINK_RUN_REAL_VECTOR_STORAGE_TESTS=false
# --- BGE-M3 稀疏向量配置 ---
SPARSE_VECTOR_ENABLED=true
# provider 切换推理实现:
# bge_m3 本地进程内加载模型(开发默认)
# bge_m3_http 调用早期 bge-m3-server(仅 sparse)
# remote_bge_m3 调用独立 bge-m3-service(dense + sparse,带重试)
SPARSE_VECTOR_PROVIDER=bge_m3
SPARSE_VECTOR_MODEL_NAME=BAAI/bge-m3
SPARSE_VECTOR_MODEL_CACHE_DIR=
SPARSE_VECTOR_LOCAL_FILES_ONLY=false
SPARSE_VECTOR_DEVICE=auto
SPARSE_VECTOR_BATCH_SIZE=12
SPARSE_VECTOR_MAX_LENGTH=8192
# 早期 bge-m3-server(仅 SPARSE_VECTOR_PROVIDER=bge_m3_http 时生效)
# 例:SPARSE_VECTOR_HTTP_ENDPOINT=http://103.205.254.30:37997
SPARSE_VECTOR_HTTP_ENDPOINT=
SPARSE_VECTOR_HTTP_TIMEOUT=30.0
# 留空请整行注释(空字符串无法解析为 int);不设则由服务端决定批大小
# SPARSE_VECTOR_HTTP_BATCH_SIZE=8
# 独立 bge-m3-service(仅 SPARSE_VECTOR_PROVIDER=remote_bge_m3 时生效)
# - URL:bge-m3-service 根地址(不带尾部斜杠)。例:http://127.0.0.1:7997
# - TIMEOUT_SECONDS:单次 /encode 请求超时(秒)。
# - MAX_RETRIES:网络错误 / 5xx 的重试次数(不含首次请求;4xx 不重试)。
BGE_M3_SERVICE_URL=
BGE_M3_TIMEOUT_SECONDS=30.0
BGE_M3_MAX_RETRIES=3
SPARSE_VECTOR_QDRANT_VECTOR_NAME=sparse_text
SPARSE_VECTOR_TOP_K=256
SPARSE_VECTOR_MIN_WEIGHT=0.0
SPARSE_VECTOR_RETRY_LIMIT=3
SPARSE_VECTOR_INDEXING_STALE_SECONDS=900
TOLINK_RUN_REAL_SPARSE_VECTOR_TESTS=false
# --- 稀疏向量召回默认值 (VectorStorageFacade.search_sparse_chunks) ---
# 调用方未传 top_k / score_threshold 时使用以下默认值。
# 默认值依据:业界保守占位(Dify "score threshold disabled = 0.0"、
# Qdrant "先广召回后精排"),本项目无评测 harness 时不盲设阈值。
# 调用方可任意 per-call 覆盖;运维可改 .env 全局收紧。
SPARSE_RETRIEVAL_TOP_K=10
SPARSE_RETRIEVAL_SCORE_THRESHOLD=0.0
# --- 稠密向量召回默认值 ---
# 与 SPARSE_RETRIEVAL_* 严格对仗。pipeline 路径下实际生效的 top_k 是 RECALL_RESULT_LIMIT;
# DENSE_RETRIEVAL_TOP_K 仅作 facade 直调的兜底默认。score_threshold 范围 [0, 1](cosine)。
DENSE_RETRIEVAL_TOP_K=10
DENSE_RETRIEVAL_SCORE_THRESHOLD=0.0
# --- Elasticsearch 配置 (推荐用于混合搜索) ---
ES_HOST=http://43.138.176.52:9200
ES_USER=elastic
ES_PASSWORD=your_es_password
ES_INDEX_NAME=tolink_rag_index
ES_INDEX_SHARDS=3
ES_INDEX_REPLICAS=1
ES_MAX_DOCUMENT_BYTES=131072
ES_MAX_TOKEN_BATCH_BYTES=5242880
ES_MAX_TOKEN_BATCH_CHUNKS=500
ES_BULK_REQUEST_TIMEOUT_SECONDS=30
ES_INDEXING_MAX_RETRY=3
ES_SMOKE_ENABLED=false
TOLINK_RUN_REAL_ES_INDEX_TESTS=false
# 原始文档存储 (MinIO / S3 兼容)
STORAGE_TYPE=minio
MINIO_ENDPOINT=43.138.176.52:9000
MINIO_ACCESS_KEY=your_minio_access_key
MINIO_SECRET_KEY=your_minio_secret_key
MINIO_BUCKET_NAME=tolink-rag-docs
MINIO_USE_SSL=false
# 如果 STORAGE_TYPE=local,则生效以下路径
LOCAL_DOCS_PATH=./data/documents
# 解析任务源文件临时落盘目录
# 流式下载在此创建临时文件;解析为 markdown 后立即清理;worker 启动时清空兜底。
# 不预设最小容量,沿用部署机系统盘大小;写满时报错码 TEMP_DISK_FULL。
PARSE_TEMP_DIR=/tmp/tolink-rag-parse
# 文档解析后端选择(PDF)
# 可选值: auto / mineru / opendataloader / naive
# auto: MinerU → OpenDataLoader → Naive 全链路降级
PDF_PARSER_BACKEND=mineru
# 逗号分隔的回退链。留空表示不回退到本地解析器。
PDF_PARSER_FALLBACKS=
# PDF 图片资产是否后台异步上传到对象存储。开启后主链路不等待图片上传完成。
PDF_IMAGE_UPLOAD_ASYNC=true
# 图片增强最多直接使用多少张解析阶段内存图片
PDF_IMAGE_ENHANCEMENT_MEMORY_MAX_IMAGES=20
# 图片增强直接使用解析阶段内存图片的总字节上限
PDF_IMAGE_ENHANCEMENT_MEMORY_MAX_BYTES=52428800
# OpenDataLoader 官方要求系统 PATH 中可用 Java 11+
# Docling 图片分辨率比例(越大越清晰,速度更慢)
DOCLING_IMAGES_SCALE=2.0
# Docling 默认是否强制全页 OCR
DOCLING_FORCE_FULL_PAGE_OCR=false
# MinerU 官方云端 V4 API 地址。mineru 后端不再支持本地 mineru-api。
MINERU_API_URL=https://mineru.net/api/v4/extract/task
# MinerU 云服务专属 Token
MINERU_API_KEY=your_mineru_api_key_here
# MinerU API 请求超时(秒),长文档建议设大
MINERU_TIMEOUT=300
# MinerU 精准解析模型,可选 pipeline / vlm / MinerU-HTML
MINERU_MODEL_VERSION=vlm
# ==========================================
# MQ 消息中台配置 (Message Queue)
# ==========================================
# 可选值: kafka / rabbitmq
MQ_VENDOR=kafka
# --- Kafka 配置 ---
KAFKA_BOOTSTRAP_SERVERS=43.138.176.52:9092
KAFKA_SASL_MECHANISM=PLAIN
KAFKA_SASL_USERNAME=root
KAFKA_SASL_PASSWORD=your_kafka_sasl_password
KAFKA_SECURITY_PROTOCOL=SASL_PLAINTEXT
KAFKA_MAX_POLL_INTERVAL_MS=900000
INIT_KAFKA_TOPICS_ON_STARTUP=false
REPLICATION_FACTOR=1
MIN_INSYNC_REPLICAS=1
PARSE_TASK_TOPIC=tolink.rag.parse_task
PARSE_TASK_PARTITIONS=1
PARSE_RESULT_TOPIC=tolink.rag.parse_result
PARSE_RESULT_PARTITIONS=1
# --- RabbitMQ 配置 ---
RABBITMQ_URL=amqp://guest:guest@localhost:5672/
RABBITMQ_EXCHANGE_NAME=
RABBITMQ_EXCHANGE_TYPE=direct
RABBITMQ_PREFETCH_COUNT=10
# --- MQ 失败兜底(恒启用死信,不提供关闭开关)---
# 业务回调抛 RetriableError 子类时最多重试 MQ_MAX_RETRIES 次,每次固定退避
# MQ_RETRY_BACKOFF_SECONDS;达上限或非可重试异常一律投递到 <原 topic> + MQ_DLQ_SUFFIX
MQ_MAX_RETRIES=3
MQ_RETRY_BACKOFF_SECONDS=1.0
MQ_DLQ_SUFFIX=.DLT
# ==========================================
# 召回执行配置 (Recall Pipeline)
# ==========================================
# 召回融合 pipeline 的通用执行参数。
RECALL_STREAM_TIMEOUT_MS=60000
RECALL_STRICT_DEFAULT=false
RECALL_RESULT_LIMIT=20
RECALL_ENABLED_SOURCES=bm25,sparse,dense
# 召回后重排(LINK-130):重排模块输出候选条数兜底默认值。
# 调用方未显式传 top_n 时生效;参考 RAGFlow rerank top_n(默认 6,本项目放宽到 8)。
RERANK_DEFAULT_TOP_N=8
# ==========================================
# 对外直连召回 SSE 配置 (Recall Direct SSE / LINK-40)
# ==========================================
# 前端凭 Java 签发的短期 session token 直连 POST /api/v1/recall/stream。
# token 短期可复用(只校验 exp,不做一次性/防重放/撤销),资源滥用由并发上限封顶。
RECALL_SESSION_AUTH_ENABLED=true
RECALL_SESSION_JWT_ISSUER=tolink-java
# 前端面凭证独立受众标识,避免与其他 token 混用。
RECALL_SESSION_JWT_AUDIENCE=tolink-rag-frontend
RECALL_SESSION_JWT_SCOPE=recall:stream
# 独立 HS256 密钥:前端面 token 可单独轮转;生产务必替换。
RECALL_SESSION_JWT_SECRET=your_recall_session_jwt_secret
# 单用户最大并发召回流数(资源主闸门)。
RECALL_SESSION_MAX_CONCURRENT=3
# ==========================================
# 杂项配置 (Misc)
# ==========================================
# 生产对外环境需把 CORS_ORIGINS 收敛为前端可信域名清单(不可用 "*",与对外直连召回端点的
# Authorization 跨域预检相关)。
CORS_ORIGINS=http://localhost:3000,http://localhost:8080