这个项目的核心理念是:与其向单个 LLM 提问(如 DeepSeek Chat V3.1、Qwen3 14B、xAI Grok 4.1 Fast、Kuaishou KAT Coder Pro V1 等),不如将它们组成一个"LLM 委员会"。本项目是一个简单的本地 Web 应用,界面类似 ChatGPT,但使用 ZenMux 将你的问题发送给多个 LLM,然后让它们互相评审和排名彼此的回答,最后由主席 LLM 生成最终答案。
更详细的工作流程:
- 阶段 1:初始观点。用户的问题被分别发送给所有 LLM,收集各自的回答。各个回答以"标签页视图"显示,用户可以逐一查看。
- 阶段 2:互评。每个 LLM 都会收到其他 LLM 的回答。在底层,LLM 的身份被匿名化,这样 LLM 就不会在评判时偏袒某些模型。LLM 被要求根据准确性和洞察力对回答进行排名。
- 阶段 3:最终答案。指定的主席 LLM 综合所有模型的回答,编译成一个最终答案呈现给用户。
这个项目 99% 是作为一个有趣的周六 hack 项目随性编写的,因为我想在 和 LLM 一起读书 的过程中并排探索和评估多个 LLM。并排查看多个回答以及所有 LLM 对彼此输出的交叉意见是非常有用的。我不会以任何方式支持它,它按原样提供,仅供他人参考,我不打算改进它。代码现在是短暂的,库已经过时了,让你的 LLM 以你喜欢的任何方式改变它。
本项目使用 uv 进行项目管理。
后端:
uv sync前端:
cd frontend
npm install
cd ..在项目根目录创建 .env 文件:
ZENMUX_API_KEY=zm-...在 ZenMux(首充8折,支持支付宝)获取你的 API key。确保购买所需的积分,或注册自动充值。
编辑 backend/config.py 自定义委员会:
COUNCIL_MODELS = [
"deepseek/deepseek-chat-v3.1",
"qwen/qwen3-14b",
"x-ai/grok-4.1-fast",
"kuaishou/kat-coder-pro-v1",
]
CHAIRMAN_MODEL = "deepseek/deepseek-chat-v3.1"更多可用的模型 ID,请查看 ZenMux Models 页面。
方式 1:使用启动脚本
./start.sh方式 2:手动运行
终端 1(后端):
uv run python -m backend.main终端 2(前端):
cd frontend
npm run dev然后在浏览器中打开 http://localhost:5173。
- 已安装 Docker 和 Docker Compose
- 域名(可选,用于生产环境)
- Cloudflare 账号(用于 SSL)
- 构建前端并启动服务:
./deploy.sh- 或者手动执行:
# 构建前端
cd frontend && npm install && npm run build && cd ..
# 启动服务
docker-compose up -d- 查看日志:
docker-compose logs -f- 停止服务:
docker-compose down- 在 VPS 上克隆仓库:
git clone <your-repo-url>
cd llm-council-zenmux- 创建
.env文件:
echo "ZENMUX_API_KEY=zm-your-key-here" > .env- 更新
nginx.conf: 将server_name _;替换为你的域名:
server_name yourdomain.com;- 部署:
./deploy.sh-
配置 Cloudflare:
- 将你的域名添加到 Cloudflare
- 添加 A 记录指向你的 VPS IP
- SSL/TLS 设置:Flexible(Cloudflare ↔ 用户:HTTPS,Cloudflare ↔ VPS:HTTP)
- 等待 DNS 传播(约 5 分钟)
-
访问应用:
- http://yourdomain.com(Cloudflare 会自动重定向到 HTTPS)
# 查看运行中的容器
docker-compose ps
# 重启服务
docker-compose restart
# 查看后端日志
docker-compose logs -f backend
# 查看 nginx 日志
docker-compose logs -f nginx
# 代码修改后重新构建
docker-compose up -d --build
# 停止并删除容器
docker-compose down
# 停止并删除容器 + 数据卷
docker-compose down -v对话数据存储在 ./data/conversations/ 目录中,并作为数据卷挂载到 Docker 容器。你的数据在容器重启后会保持不变。
- 后端: FastAPI(Python 3.10+)、async httpx、ZenMux API
- 前端: React + Vite、react-markdown 渲染
- 存储: JSON 文件存储在
data/conversations/ - 包管理: Python 使用 uv,JavaScript 使用 npm