面向安全与 AI 研究的本地论文工作台,覆盖论文导入、PDF 解析、证据化精读、跨论文检索、知识卡片、综合发现、写作导出和知识库同步。
- 论文导入与解析:上传 PDF 或从每日推荐导入论文,使用 MinerU 解析正文、公式、表格、图片和补充材料,并保存到本地 SQLite 与文件目录。
- 四类分析工作流:Insight Snap 做快速价值判断,Logic Lens 做结构化深读,Research Sphere 扩展引用/相关工作图谱,Smart Q&A 自动判断问题并路由到摘要、深读、图谱或单篇问答。
- 证据化知识资产:从分析结果生成 claim、method、dataset、metric、result、limitation、question、writing snippet 等知识卡片,保留页码、片段和来源关系。
- 本地论文库与知识空间:管理论文元数据、分组、阅读状态、笔记、批注、AI review marks、Dify 同步状态,并把不同知识空间绑定到不同 Dify dataset。
- 每日 arXiv 推荐:按主题抓取候选论文,打分、翻译、反馈、导入、提升到知识空间,并可直接启动后续分析。
- 跨论文检索与综合:基于本地图谱和可选 Dify RAG 做语料检索、跨论文问答、问答历史复用与删除、冲突关系发现、研究 gap 候选和综合卡片沉淀。
- 写作与导出:从已确认卡片生成 related work/method/experiment/limitation 片段,生成论文对比表;导出以复制为主,必要时下载 Markdown、Obsidian、BibTeX、RIS、Zotero CSL JSON。
- 运行维护:提供 LLM 运行时设置、模型连通性测试、DeepLX 翻译、健康检查、缓存清理、限流和公开发布检查。
| 页面 | 用途 |
|---|---|
/upload |
上传 PDF 并创建论文记录 |
/daily |
每日推荐、反馈、导入和提升 |
/papers |
论文列表、分析入口、最近运行和 PDF 查看 |
/library |
本地论文库、分组、状态、同步、跨库问答和历史记录管理 |
/knowledge |
知识卡片、批量审核、合并和去重 |
/synthesis |
综合卡、冲突关系、研究 gap 看板和批量构建 |
/writing |
草稿合成、对比表和复制优先的外部导出 |
/knowledge-spaces |
知识空间、dataset 绑定和 Dify 文档管理 |
/translate |
DeepLX 文本翻译 |
/health |
解析、同步、知识资产和索引健康检查 |
/settings |
LLM Base URL、模型、API Key 和 reasoning effort |
| 服务 | 技术栈 | 默认端口 | 说明 |
|---|---|---|---|
frontend |
Next.js 15 / React 19 / Tailwind | 3001 |
Web UI、PDF 查看、SSE 运行状态和 API 代理 |
backend |
FastAPI / LangGraph / SQLite | 8001 |
论文解析、LLM 工作流、知识资产、检索、导出和健康检查 |
dify-proxy |
FastAPI | 3002 |
可选服务,把 Dify Dataset API Key 留在服务端 |
直接执行一键脚本时会同时启动 frontend、backend、dify-proxy 和本地 Dify 知识库栈。只需要核心论文工作台时仍可显式使用 minimal profile。
需要 Docker 24+ 和 Docker Compose 2.20+。
git clone https://github.com/NewWr/ai4sec.git
cd ai4sec
./scripts/ai4sec_config.sh initinit 会复制 .env.example,并只为缺失的 APP_ACCESS_PASSWORD、APP_ACCESS_SESSION_SECRET、BACKEND_INTERNAL_API_TOKEN 和 DIFY_PROXY_TOKEN 生成四个相互独立的安全随机值;重复执行不会覆盖已有值。
编辑 .env,填写实际使用的 LLM 与 MinerU 配置:
LLM_BASEURL=https://api.openai.com/v1
LLM_APIKEY=
THINKING_MODELNAME=
MINERU_TOKEN=如果不使用本机代理,请清空 AI4SEC_BACKEND_PROXY;如果使用本机代理,保持为实际代理地址。
./start_ai4sec.sh启动前会一次性检查全部必需配置。默认 dify profile 会启动完整知识库链路;检测到 dify-rag/docker/docker-compose.yaml 时会自动拉起该栈并保留现有 checkout 内的知识库卷。仅启动核心服务可使用 ./start_ai4sec.sh minimal。
该启动器面向可信局域网使用:自动检测本机局域网 IPv4 地址,把前端发布到所有 IPv4 网卡,并在 UFW 启用时只放行当前局域网子网。启动完成后会打印可供同一路由器设备直接访问的 IP:端口 地址。启动器固定关闭前端访问密码;后端和 Dify 代理仍只监听 127.0.0.1,内部 API 令牌保持启用。仅在已手工配置其他防火墙时使用 --no-configure-firewall。
访问:
停止服务:
docker compose --profile dify down运行数据保存在 ./docker-data/,该目录不会提交到 Git。
dify-rag/ 是本地开发目录,不随本项目发布。公开部署时请单独部署 Dify,再让 AI4Sec 通过 dify-proxy 访问 Dify Dataset API。
示例:
git clone https://github.com/langgenius/dify.git dify-rag
cd dify-rag/docker
cp .env.example .env
docker compose up -d在 AI4Sec 的 .env 中配置:
DIFY_DOCKER_NETWORK=docker_default
DIFY_API_BASE=http://dify-proxy:3002
DIFY_BASE_URL=http://nginx
DIFY_DATASET_API_KEY=
DIFY_DEFAULT_DATASET_ID=
DIFY_ANALYSIS_DATASET_ID=
DIFY_SEARCH_METHOD=keyword_search当 AI4SEC_DIFY_COMPOSE_FILE= 为空且仓库内存在 dify-rag/docker/docker-compose.yaml 时,一键脚本会自动启动该本地栈,并把 checkout 内的既有卷明确报告为 legacy-local-unmanaged,不会静默迁移或覆盖知识库数据。没有本地 checkout 时,Dify 由外部部署管理。
新部署需要把 Dify 数据纳入 AI4Sec 统一存储根时,显式配置仓库相对路径和存储覆盖文件:
AI4SEC_DIFY_COMPOSE_FILE=dify-rag/docker/docker-compose.yaml
AI4SEC_DIFY_STORAGE_OVERRIDE_FILE=deploy/dify-storage.override.yml
AI4SEC_DIFY_PROFILES=postgresql,weaviate,collaboration
AI4SEC_DIFY_PUBLIC_URL=http://127.0.0.1:3080启动完整服务:
./start_ai4sec.sh默认 dify profile 会启动本地 Dify 栈以及 dify-proxy backend frontend。仍可显式执行 ./start_ai4sec.sh dify;./start_ai4sec.sh minimal 只启动核心服务。文档同步由 backend 的 durable outbox worker 唯一执行,脚本会停用遗留的 ai4sec-dify-sync 容器,真实 Dataset API Key 只注入 dify-proxy。
正常启动会先构建当前源码;镜像源临时不可用时,脚本只在确认完整本地镜像集存在后继续启动。明确使用现有镜像可执行 ./start_ai4sec.sh --skip-build。
检查集成状态:
curl http://localhost:3002/health
curl http://localhost:8001/api/system/health两个公开健康端点成功后,可从前端知识库页面检查已认证的 Dify 集成状态。
| 变量 | 作用 |
|---|---|
LLM_BASEURL / LLM_APIKEY / THINKING_MODELNAME |
OpenAI 兼容 LLM 地址、密钥和可选模型列表,多个模型用逗号分隔 |
MINERU_TOKEN |
PDF 解析必需 |
EASYSCHOLAR_SECRET_KEY / TAVILY_KEY |
期刊/会议分级和 Web 兜底检索 |
UNPAYWALL_EMAIL / CORE_API_KEY / ELSEVIER_API_KEY / WILEY_TDM_TOKEN |
Research Sphere 参考文献全文获取 |
DIFY_* |
Dify RAG、同步和知识空间 dataset 绑定 |
DEEPLX_API_BASE / DEEPLX_API_KEY |
无翻译运行时配置时,用于初始化内置 DeepLX profile;可在“系统设置 → Translation”中改为独立的 OpenAI 兼容翻译 LLM |
DAILY_RECOMMENDATION_* |
每日推荐主题、数量、阈值、自动刷新时间和目标知识空间 |
PROJECT_WORKSPACE_ENABLED |
是否启用 owner-scoped Research Project API 和项目工作区 |
LEGACY_AI_WRITES_ENABLED |
是否允许已退役的卡片、关系、gap、写作 AI 写入,默认关闭;历史数据仍可读取 |
AUTO_KNOWLEDGE_CARDS_ENABLED |
是否允许自动知识卡片生成,默认关闭 |
RESEARCH_DISCOVERY_LLM_VERIFY_ENABLED |
是否用 LLM 复核跨论文关系候选 |
DOCUMENT_PARTITION_ENABLED / SUPPLEMENTARY_INDEX_ENABLED |
大文档分段和补充材料索引 |
APP_ACCESS_PASSWORD / APP_ACCESS_SESSION_SECRET |
直接使用 Compose 时的可选前端访问密码和会话签名密钥;start_ai4sec.sh 固定关闭该密码 |
BACKEND_INTERNAL_API_TOKEN |
前端服务端代理访问后端的内部凭据,不得使用 NEXT_PUBLIC_* 变量 |
ADMIN_API_TOKEN |
保护 /api/admin/* 和运行时设置写入接口 |
“系统设置 → Translation”中的 URL、API Key 和模型保存在持久化存储根的
translation_runtime_config.json 中,与 Research LLM 的
llm_runtime_config.json 完全独立。翻译执行不会读取或回退到
LLM_BASEURL、LLM_APIKEY、THINKING_MODELNAME;空白密钥表示保留已保存密钥,
只有勾选“清空”才会删除密钥。便携导出会移除翻译密钥,同时保留 profile 名称、
URL、模型和 active 选择。
| ENABLE_DOCS=false | 生产环境关闭 Swagger/OpenAPI |
完整变量见 .env.example。
后端:
cd backend
uv sync
BACKEND_INTERNAL_API_TOKEN="dev-internal-token" \
uv run uvicorn app.main:app --reload --port 8000
uv run pytest前端:
cd frontend
npm install
BACKEND_URL="http://127.0.0.1:8000" \
BACKEND_INTERNAL_API_TOKEN="dev-internal-token" \
APP_ACCESS_PASSWORD="dev-password" \
APP_ACCESS_SESSION_SECRET="dev-session-secret" \
npm run dev
npm run build生产构建不读取运行时密码或 session secret。部署契约检查可直接运行 ./scripts/test_deployment_config.sh。
ai4sec/
├── backend/ # FastAPI、LangGraph 工作流、SQLite、PDF/LLM/Dify/知识资产服务
├── frontend/ # Next.js 页面、组件、PDF 查看和 API 客户端
├── dify-proxy/ # 可选 Dify Dataset API 代理
├── docs/ # 发布与部署说明
├── scripts/ # 配置预检、部署契约和公开发布检查脚本
├── start_ai4sec.sh # 默认启动 AI4Sec、Dify 代理和本地知识库完整栈
├── docker-compose.yml
└── .env.example
不要提交 .env、docker-data/、.local-dev-data/、backend/data/、dify-rag/、ai4sec-dify-sync/state/*.db、PDF、数据库、解析产物或任何 API Key。使用以下命令构建公开发布产物:
scripts/export_public_release.sh --output /tmp/ai4sec-public导出产物只有一个干净提交,并会自动执行发布扫描;它保留当前工作树源码,但不复制既有 Git 历史。
本项目以 MIT License 开源。
