Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions fastapi_app/config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,48 @@ class AppSettings(BaseSettings):
LOCAL_EMBEDDING_CUDA_VISIBLE_DEVICES: Optional[str] = None
LOCAL_EMBEDDING_GPU_MEMORY_UTILIZATION: float = 0.3

# ── GraphRAG ──────────────────────────────────────────────────────────────
# 查询侧默认用较快聊天模型;索引抽取亦走同一 default_chat_model(见 settings.yaml)
GRAPHRAG_LLM_MODEL: str = "deepseek-v3.2"
GRAPHRAG_EMBEDDING_MODEL: str = "text-embedding-3-small"
# True 且 USE_LOCAL_EMBEDDING=1 时,查询/索引写入的 embedding 指向本地 vLLM(须与向量维度一致;从 OpenAI 维度过来的库需重建索引)
GRAPHRAG_USE_LOCAL_EMBEDDING_RUNTIME: bool = True
GRAPHRAG_OUTPUT_DIR: str = "outputs/graphrag_kb" # workspace root, layout: {dir}/{email}/{nb_id}/
GRAPHRAG_CMD: str = "" # graphrag CLI path; auto-detected from PATH if empty
GRAPHRAG_CHUNK_SIZE: int = 384 # chars per chunk; also written to settings.yaml chunks.size
GRAPHRAG_CHUNK_OVERLAP: int = 48
# 写入 prompt,偏短输出可缩短 local_search 生成时间
GRAPHRAG_RESPONSE_TYPE: str = "At most 4 bullet points; be concise."
GRAPHRAG_COMMUNITY_LEVEL: int = 1 # 低于 2 通常更快,社区上下文更少
GRAPHRAG_LOCAL_SEARCH_CONTEXT_MAX_TOKENS: int = 12000 # 低于 24000 可加快检索上下文组装与生成
GRAPHRAG_SUBGRAPH_PRUNE_ENABLED: bool = True # run LLM subgraph pruning after each query
GRAPHRAG_SUBGRAPH_PRUNE_MODEL: str = "deepseek-v3.2" # 仅单独裁剪路径使用
GRAPHRAG_SUBGRAPH_PRUNE_MAX_EDGES_INPUT: int = 28 # 裁剪+Judge 合并路径:输入边数上限(越小越快)
GRAPHRAG_SUBGRAPH_PRUNE_MAX_TOKENS: int = 512 # 单独裁剪 LLM 输出上限(若仍启用旧路径)
# 裁剪与 Judge 合并为一次 LLM(graphrag_chat / graphrag_kb query)
GRAPHRAG_PRUNE_JUDGE_MODEL: Optional[str] = None # 为空则用 JUDGE_MODEL
GRAPHRAG_PRUNE_JUDGE_MAX_TOKENS: int = 768 # 合并调用输出上限(含 analysis + judge JSON)
GRAPHRAG_MAX_HIGHLIGHT_HINTS: int = 10 # max highlight_hints returned (0 = unlimited)
# 子图实体名 → Wikidata 搜索 → 在 GraphRAG query/chat 答案末尾附加简短参考(需出网)
GRAPHRAG_WIKIDATA_ENRICH_ENABLED: bool = True
GRAPHRAG_WIKIDATA_LANG: str = "zh" # wbsearchentities + 标签/描述优先语言
GRAPHRAG_WIKIDATA_MAX_ENTITIES: int = 8 # 最多解析的不重复实体数
# HTTPS 读超时(秒);弱网可再加大或通过 HTTP 代理访问 wikidata.org
GRAPHRAG_WIKIDATA_TIMEOUT_SEC: float = 45.0
GRAPHRAG_WIKIDATA_CONNECT_TIMEOUT_SEC: float = 10.0
# 对 Read timeout / 连接错误额外重试次数(每次递增短暂退避)
GRAPHRAG_WIKIDATA_HTTP_RETRIES: int = 2
GRAPHRAG_WIKIDATA_API_URL: str = "https://www.wikidata.org/w/api.php"

# ── KGGen (optional triple extraction, disabled by default) ───────────────
KGGEN_MODEL: str = "deepseek-v3.2"
KGGEN_PER_CHUNK: bool = True # True = per-chunk calls; False = full-text single call
KGGEN_LOG_CHUNK_INTERVAL: int = 10 # log every N chunks (0 = first/last only)

# ── Judge (answer confidence scoring) ─────────────────────────────────────
JUDGE_MODEL: str = "deepseek-v3.2" # 单独 Judge;合并路径默认同此模型
JUDGE_MAX_TOKENS: int = 256 # 弱化:更短 judge 输出

class Config:
env_file = ".env"
env_file_encoding = "utf-8"
Expand Down
14 changes: 14 additions & 0 deletions fastapi_app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
from fastapi.responses import FileResponse

from fastapi_app.routers import auth, data_extract, files, kb, kb_embedding, paper2drawio, paper2ppt
from fastapi_app.routers import graphrag_kb
from fastapi_app.middleware.api_key import APIKeyMiddleware
from fastapi_app.middleware.logging import LoggingMiddleware
from workflow_engine.utils import get_project_root
Expand Down Expand Up @@ -428,6 +429,17 @@ async def _lifespan(app: FastAPI):
os.environ["LOCAL_MINERU_API_URL"] = mineru_base_url
os.environ["LOCAL_MINERU_MODEL"] = resolved_mineru_model

def _warmup_graphrag_imports() -> None:
try:
import graphrag.config.load_config # noqa: F401
from graphrag import api as _graphrag_api # noqa: F401
from graphrag.cli.query import _resolve_output_files # noqa: F401
log.info("GraphRAG 相关 Python 包已预导入,可降低首次查询的 import 冷启动")
except ImportError as exc:
log.debug("GraphRAG 预导入跳过: %s", exc)

_warmup_graphrag_imports()

yield
for proc in managed_procs:
if proc.poll() is None:
Expand Down Expand Up @@ -476,6 +488,8 @@ def create_app() -> FastAPI:
app.include_router(paper2drawio.router, prefix="/api/v1", tags=["Paper2Drawio"])
app.include_router(paper2ppt.router, prefix="/api/v1", tags=["Paper2PPT"])
app.include_router(auth.router, prefix="/api/v1", tags=["Auth"])
# GraphRAG 知识库:/api/v1/graphrag-kb/{index,query,merge,chunk-snippet} → wa_graphrag_kb → wf_graphrag_kb
app.include_router(graphrag_kb.router, prefix="/api/v1", tags=["GraphRAG KB"])

# 静态文件:/outputs 下的文件(兼容 URL 中 %40 与 磁盘 @ 两种路径)
project_root = get_project_root()
Expand Down
Loading