uv add -r requirements.txt
uv pip install -U FlagEmbedding
uv pip install -U "mineru[core]" -i https://mirrors.aliyun.com/pypi/simple
Optional, to speed up vllm inference, might cause some dependency issues also:
uv pip install flashinfer-python -i https://flashinfer.ai/whl/cu126/torch2.7/
- 创建.env文件, 根据model-config.yaml和config.yaml中用到的配置填写参数, 如
DASHSCOPE_API_KEYOPENAI_API_KEY- ...
model-config.yaml 兼容 litellm 格式的参数
config.yaml 为其他可选择参数, 如embedder/reranker模型参数等, 具体见注释
- 如果不需要本地运行模型, 修改
model-config.yaml中private-系列模型的配置同public-系列模型配置后直接启动即可
chmod +x run.sh && ./run.sh
- 如果需要本地运行private模型, 请先启动vLLM模型服务, 如
vllm serve stelterlab/Mistral-Small-3.2-24B-Instruct-2506-FP8 \
--tokenizer-mode mistral \
--config-format mistral \
--load-format mistral \
--tool-call-parser mistral \
--enable-auto-tool-choice \
--max-model-len 8192 \
--gpu-memory-utilization 0.7
再运行
chmod +x run.sh && ./run.sh
- Typesense 可视化界面:
cd typesense/simple-ui/ && uvicorn main:app --reload --port 2245 - Milvus 可视化界面: 推荐使用Attu, 图形化配置地址即可
- 文档: 启动FastAPI服务,并访问http://127.0.0.1:8000/docs
- langfuse: 本地启动
cd langfuse
docker compose up -d在可视化页面中配置用户信息之后, 在根目录的.env文件下配置
LANGFUSE_PUBLIC_KEY=""
LANGFUSE_SECRET_KEY=""
LANGFUSE_HOST=""
即可追踪后续的LLM调用
测试系统分成几种测试类型
- 普通单元测试
- benchmark测试
- llm测试, 主要用来测试llm模型, 会有一定的耗时和api开销, 推荐手动调用
- external测试, 主要用来测试外部依赖, 如数据库、搜索引擎、embedding模型、外部api服务等, 有些还需要自行生成测试集, 推荐手动调用
运行单元测试
python -m pytest -m "not benchmark and not external and not llm"
运行benchmark测试
python -m pytest -m "benchmark"
推理性能测试
cargo install --git https://github.com/huggingface/inference-benchmarker/
uv run vllm serve stelterlab/Mistral-Small-3.2-24B-Instruct-2506-FP8 \
--tokenizer-mode mistral \
--config-format mistral \
--load-format mistral \
--tool-call-parser mistral \
--enable-auto-tool-choice \
--max-model-len 8192 \
--gpu-memory-utilization 0.8
# 由于mistral的模型使用tekken的自定义tokenizer, 与inference不兼容, 采用社区版本的tokenizer替代
inference-benchmarker \
--tokenizer-name "unsloth/Mistral-Small-3.2-24B-Instruct-2506-unsloth-bnb-4bit" \
--url http://localhost:8000 \
--profile chat --model-name "stelterlab/Mistral-Small-3.2-24B-Instruct-2506-FP8"
在学术研究的征途上,撰写项目申请书是每位科研人无法回避的挑战。我们不仅要在海量文献与内部资料中挣扎,还要应对内容填充的时间窘境。而传统的AI工具因"幻觉"与结构化能力缺失,难以胜任这项严肃而复杂的工作。
为了终结这场效率与质量的拉锯战,我们带来了「思源」——一个深度融合**"高效率、低幻觉、结构化、多模态"**核心价值的AI研究伙伴,旨在将科研人员从繁重的案头工作中解放出来,回归创新的本质。
「思源」如何重塑您的科研写作流程?
- 构建您的专属知识大脑: 「思源」允许您轻松导入私有研究成果与公开学术论文,通过元数据管理,构建一个结构清晰、可随时调用的项目专属知识大脑。
- 成为您的全流程AI写作副驾:「思源」将全程陪伴,赋能从构思到定稿的每一个环节:
- 从灵感构思时的对话风暴与"持久记忆"形成;
- 到框架起草时,一键补全"研究目标"、"技术方案"等结构化章节;
- 再到内容撰写时,它提供两种杜绝幻觉的模式:基于私库的**"查找式补全"与精准定位原文的"照引式补全"**,并自动标注引用来源;
- 保证您的数据绝对安全:我们深知科研数据的高度敏感性。「思源」将您的私有知识库与生成内容严格留存于本地,杜绝任何云端上传与数据外泄风险,为您的核心成果保驾护航。
「思源」最大的创新在于,它建立了一套**"先检索、后生成、再溯源"**的严谨工作流,从根本上解决了通用AI在严肃学术写作中的"幻觉"和"空洞"问题。同时,「思源」致力做到用户无感知,以实时补全的方式,让您能做到"心有所想,笔有所成"。
选择「思源」,让我们一起迎接一个更加专注、高效、充满创造力的科研新范式。
「思源」采用微服务架构,由多个独立服务协同工作,确保系统的可扩展性、可维护性和高可用性:
┌──────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Frontend UI │ │ API Service │ │ Task Queue │
│VSCode/Word(React)│◄─┤ FastAPI │◄─┤ Celery │
└──────────────────┘ └─────────────────┘ └─────────────────┘
│
┌────────────────────┼────────────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌──────────────────┐
│ Doc Search │ │ Vector DB │ │ Image Search │
│ Typesense │ │ Milvus │ │ BGE-VL embedding │
└─────────────┘ └─────────────┘ └──────────────────┘
│ │ │
└────────────────────┼────────────────────┘
▼
┌──────────────┐
│ LLM │
│ vLLM / API │
└──────────────┘
- 后端框架: FastAPI + SQLModel + Pydantic
- 数据库: SQLite (用户管理) + Milvus (向量存储) + Typesense (文档搜索)
- 任务队列: Celery + Redis
- 文档处理: MinerU (PDF解析) + Stanza (NLP)
- 向量化: BGE-M3 (文本) + BGE-VL (图像)
- 监控: Langfuse (LLM调用链路追踪)
- 部署: Docker Compose
- 多格式支持: PDF、DOCX、Markdown、TXT等主流格式
- 智能解析: 利用MinerU进行高质量PDF文档解析,保留格式和结构信息
- 权限控制: 支持公开/私有文档分类管理
- 元数据提取: 自动提取作者、发表日期、关键词等元信息
- 语义感知切块: 基于语义边界进行文档分块,而非简单字符截断
- 多语言支持: 中英文智能分句处理
- 上下文保持: 保留段落间的逻辑关系
- 混合检索: 结合Typesense的关键词检索和Milvus的向量检索
- 语义理解: 基于BGE-M3模型的深度语义匹配
- 精确定位: 支持段落级精确定位和引用溯源
- 图文跨模态: 支持用文本查询图像内容
- 视觉语义理解: 基于BGE-VL模型的图像语义编码
- 相似度匹配: 高精度图像相似度计算
- 上下文感知: 基于当前编辑位置的上下文进行智能补全
- 引用式生成: 确保生成内容有明确的文献来源
- 实时响应: 毫秒级响应速度,无感知体验
- 多模态: 支持多种输入模式,如文本、图片、音频、视频等
- 结构化: 确保生成的内容结构清晰、一致
- 查找式补全: 从知识库中检索相关内容进行补全
- 照引式补全: 基于特定文献段落进行精确引用补全
- 结构化补全: 针对特定章节(如研究目标、技术方案)的结构化生成
- JWT Token: 基于JWT的无状态身份认证
- 会话管理: 支持多设备登录管理
- 权限控制: 细粒度的API访问权限控制
- 本地存储: 所有数据严格保存在本地,不上传云端
- 访问隔离: 用户间数据完全隔离
- 传输加密: API通信支持HTTPS加密
POST /api/v1/users/register- 用户注册POST /api/v1/users/login- 用户登录GET /api/v1/users/me- 获取当前用户信息
POST /api/v1/propilot/doc/upload- 文档上传POST /api/v1/propilot/doc/search- 文档搜索
POST /api/v1/propilot/image/upload- 图像上传POST /api/v1/propilot/image/search- 图像搜索
POST /api/v1/propilot/completion- 智能补全POST /api/v1/propilot/summarize- 文段总结POST /api/v1/propilot/refine- 文字润色
GET /api/v1/utils/health- 健康检查GET /api/v1/utils/resources- 系统资源监控GET /api/v1/milvus/collections- 向量集合管理
完整的API文档可通过访问 http://localhost:1145/docs 查看。
系统使用 config.yaml 进行统一配置管理
创建 .env 文件并配置以下环境变量:
# -*- coding: utf-8 -*-
OPENAI_API_BASE=https://api.chatgptsb.com/v1
OPENAI_API_KEY=replace
DASHSCOPE_API_KEY=replace
DASHSCOPE_API_BASE=https://dashscope.aliyuncs.com/compatible-mode/v1
HF_API_KEY=replace
LANGFUSE_PUBLIC_KEY=replace
LANGFUSE_SECRET_KEY=replace
LANGFUSE_HOST="http://localhost:3333"propilot/
├── api/ # FastAPI应用
│ ├── routes/ # API路由
│ ├── services/ # 业务逻辑服务
│ ├── dto/ # 数据传输对象
│ ├── models.py # 数据模型
│ ├── auth.py # 认证逻辑
│ └── config.py # 配置管理
├── milvus/ # Milvus向量数据库操作
├── search/ # Typesense搜索引擎
├── utils/ # 工具函数
├── tests/ # 测试用例
├── finetune/ # 模型微调相关
├── documents/ # 文档存储
└── images/ # 图像存储
- 克隆项目
git clone git@github.com:Ayanami1314/propilot.git
cd propilot- 安装依赖
# 使用uv (推荐)
uv sync
# 或使用pip
pip install -r requirements.txt- 启动依赖服务
# 启动所有Docker服务
docker-compose up -d
# 或分别启动
cd typesense && docker compose up -d
cd langfuse && docker compose up -d
cd milvus && docker compose up -d
cd mineru && docker compose up -d- 启动应用服务
# 启动API服务
uvicorn api.main:app --port 1145 --reload
# 启动Celery工作进程
celery -A api.mq worker --loglevel=INFO --pool=threads
# 启动文档搜索UI (可选)
cd typesense/simple-ui && uvicorn main:app --reload --port 2245运行测试套件:
# 运行所有测试
pytest
# 运行特定测试
pytest tests/test_search.py
# 运行覆盖率测试
pytest --cov=api tests/访问 http://localhost:3333 查看LLM调用链路追踪,包括:
- 请求响应时间
- Token使用量统计
- 错误率监控
- 成本分析
访问 /api/v1/utils/resources 获取实时系统资源使用情况:
{
"cpu_percent": "15.2%",
"memory": {
"total": "32.00 GB",
"available": "18.45 GB",
"used": "13.55 GB",
"percent": "42.3%"
},
"disk": {
"total": "500.00 GB",
"used": "245.67 GB",
"free": "254.33 GB",
"percent": "49.1%"
}
}本项目采用 MIT 许可证,详见 LICENSE 文件。
如遇到问题或有功能建议,请通过以下方式联系我们:
- 提交 GitHub Issue
- 发送邮件至项目维护者
「思源」团队致力于为科研工作者提供最优质的AI写作辅助工具,让科研创作回归本质,让创新思维自由飞翔。
注1: 此仓库同时为上海交通大学SE2303软件工程原理的开发大作业仓库
注2: 此仓库同时为上海交通大学2025AI应用创新大赛的代码仓库
