一个面向真实社交场景的 Agent 交友匹配平台:让用户先和自己的 Agent 建立理解,再由 Agent 主动发现更匹配的人。
To do:
- agent暂时无法主动探索,探索需要人工主动操作
以下截图由 Selenium 自动化流程基于
PyJa账号登录后采集,展示的是系统当前真实页面数据。
Agent Social Match 不是“聊聊天就结束”的机器人项目,而是一个完整的交友流程系统:
- 用户先和个人 Agent 多轮对话,沉淀可持续更新的画像与偏好。
- Agent 后台主动和其他 Agent 对话,进行发现与匹配评估。
- 双向同意后进入私信(DM),把“推荐”变成“可行动的连接”。
在本项目里,Agent 不是一个简单聊天窗口,而是一个具备明确职责的“可持续运行的软件角色”。
它至少包含 4 个能力层:
- 身份层(Identity):
name+personality,定义这个 Agent 的表达风格、关注点和行为边界。 - 记忆层(Memory):通过多轮对话持续抽取并更新用户画像(兴趣、边界、沟通风格等)。
- 决策层(Reasoning & Policy):基于提示词约束和阈值策略做匹配判断,不是“逢人就推”。
- 执行层(Action):可触发后台探索、生成推荐、创建私信入口等实际动作。
一句话:Agent = LLM + 可持久化状态 + 决策策略 + 可执行动作。
本项目按 OpenAI 兼容接口实现了模型接入底座,可灵活切换 DeepSeek 或 Qwen。
在 .env 中配置:
LLM_BASE_URLLLM_API_KEYLLM_MODEL
示例(DeepSeek):
LLM_BASE_URL="https://api.deepseek.com/v1"
LLM_MODEL="deepseek-chat"示例(Qwen 兼容网关):
LLM_BASE_URL="https://<your-qwen-compatible-endpoint>/v1"
LLM_MODEL="qwen-plus"只要目标服务兼容 Chat Completions,本项目不需要改业务代码。
你可以在这两处定制 Agent:
app/main.py的_build_chat_system_prompt:定义“用户-Agent”对话规则(例如只围绕学生画像)。app/services/llm_client.py的evaluate_match提示词:定义“Agent-Agent 推荐评估”的标准(是否保守、是否需要高置信度)。
本项目提供了可调参数(.env):
DISCOVERY_MIN_MATCH_SCOREDISCOVERY_MIN_CONFIDENCEDISCOVERY_REC_COOLDOWN_HOURSDISCOVERY_MAX_PENDING_RECOMMENDATIONS
你可以把它理解为“模型输出之后的产品策略闸门”。
可扩展为以下 Agent:
- 学习规划 Agent:课程节奏、复习计划、DDL 管理。
- 社团/活动匹配 Agent:兴趣社群发现与联系人推荐。
- 室友/搭子匹配 Agent:作息、习惯、边界偏好匹配。
- 实习协作 Agent:简历互助、项目组队、沟通风格匹配。
- 降低冷启动门槛:用户不必先写复杂资料,先聊天再逐步完善画像。
- 减少黑盒焦虑:可查看 Agent 发现过程中的对话转录。
- 更可控的对话边界:模型被约束在交友画像范围,降低跑题与幻觉。
- 长期记忆可持久化:上下文记忆存入数据库,支持持续优化推荐。
| 模块 | 说明 | 当前状态 |
|---|---|---|
| 用户注册/登录 | 用户名 + 邮箱验证码 + 密码登录,自动创建专属 Agent | ✅ |
| 用户-Agent 聊天 | 多轮对话、即时回复 | ✅ |
| 画像增量抽取 | 每 3 条用户消息自动更新画像 | ✅ |
| Agent 后台发现 | 非阻塞后台任务,不卡页面 | ✅ |
| 发现过程可视化 | 支持查看 Agent-Agent 聊天转录 | ✅ |
| 双向同意机制 | 推荐双方均同意后建立关系 | ✅ |
| 私信 DM | 双向同意后自动创建用户私信入口 | ✅ |
Browser (Jinja2 SSR)
|
v
FastAPI Web/API Layer
|
+--> Chat Service ---------> LLMClient (OpenAI-compatible API)
|
+--> Discovery Service ----> Agent-Agent Conversation + Match Eval
|
+--> Auth/DM/Recommendation Services
|
v
Async SQLAlchemy (SQLite / aiosqlite)
flowchart LR
A[数据采集\n用户-Agent聊天/Agent-Agent探索/推荐与DM日志] --> B[画像抽取\n增量合并/边界识别]
B --> C[召回层\n向量cosine + 集合交集 + 冷却过滤]
C --> D[精排层\nReAct多轮对话 + Self-Consistency]
D --> E[仲裁层\nJudgeAgent风险检测]
E --> F[策略闸门\nscore/confidence/judge三重控制]
F --> G[推荐落库\n带highlights/risks卡片]
- 粗召回:cosine 语义相似度 + 兴趣/特征集合交集 + cooldown 过滤
- 精排:4 轮 Agent 间 ReAct 对话(Thought/Action/Observation)+ LLM 多次评估取中位数(Self-Consistency)
- 仲裁:JudgeAgent 独立审查边界冲突与对话越界,可 veto
- 闸门:score / confidence / judge_pass 三重联合控制,避免"逢人就推"
sequenceDiagram
participant U as User
participant A as Personal Agent
participant D as Discovery Service
participant J as JudgeAgent
participant L as LLM
participant DB as Database
U->>A: 多轮聊天(可触发 Tool Use)
A->>L: 画像抽取/上下文整理
L-->>A: 结构化画像
A->>DB: 持久化 personality + embedding
A->>D: 后台发现触发
D->>L: 4 轮 ReAct 对话 + 多次评估
L-->>D: score + confidence + highlights + risks
D->>J: 仲裁请求
J-->>D: judge_pass + 调整后 score
D->>DB: 写入 recommendation(含解释卡片)
U->>DB: 双向同意
DB-->>U: 建立 DM 会话
alembic upgrade head
uvicorn app.main:app --reload
# 单测
pytest -v
# 手动验证路径
# 登录 -> 和 Agent 聊天 -> 后台探索 -> 推荐同意/拒绝 -> 进入 DMpython -m venv .venv
# Windows
.venv\Scripts\activate
# macOS/Linux
# source .venv/bin/activate
pip install -r requirements.txtcp .env.example .envWindows:
Copy-Item .env.example .env最少需要配置:
LLM_BASE_URLLLM_API_KEYLLM_MODELSESSION_SECRETEMAIL_CODE_SECRETSMTP_HOSTSMTP_PORTSMTP_USERSMTP_PASSWORD
邮箱验证码说明:
- 注册前先点击“发送验证码”,系统会发 6 位验证码到邮箱。
- 验证码默认
10分钟有效,60秒内限制重复发送(可在.env调整)。 - 登录支持“用户名或邮箱 + 密码”。
alembic upgrade head
uvicorn app.main:app --reload访问:http://127.0.0.1:8000
docker compose up --buildGET /登录/注册GET /dashboard个人控制台GET /chat/{agent_id}用户与 Agent 聊天POST /discover/{agent_id}触发后台发现GET /discovery-chat/{conversation_id}查看发现转录GET /dm/{conversation_id}私信页面
GET /api/healthGET /api/health/readyPOST /api/registerGET /api/users/{user_id}GET /api/agents/{agent_id}POST /api/conversations/user-agentGET /api/conversations/{conv_id}/messagesPOST /api/conversations/{conv_id}/messagesPOST /api/discoveryGET /api/recommendationsPOST /api/recommendations/{rec_id}/approvePOST /api/recommendations/{rec_id}/reject
系统提示词层面已加入以下约束:
- 只围绕用户画像与交友匹配相关话题。
- 禁止编造用户经历与身份信息。
- 对无关问题进行轻量拒答并拉回交友场景。
- 信息不足时明确“不知道”,并追问单个澄清问题。
- 回复长度与语气保持简洁自然。
这部分约束是产品体验的关键,不建议在未评估前移除。
- SQLite 文件:
data/matchmaking.db(已被.gitignore忽略) Agent.personality持久化字段包含:traitsinterestslooking_forvibecontext_memoryboundariesconversation_stylesnapshots
webtest/
├─ app/
│ ├─ main.py
│ ├─ api/
│ ├─ core/
│ ├─ models/
│ ├─ schemas/
│ └─ services/
├─ templates/
├─ static/
├─ alembic/
├─ tests/
├─ data/ # 仅保留 .gitkeep,数据库文件忽略
├─ .env.example
├─ .gitignore
└─ README.md
python -m compileall app
pytest -v多 Agent 与推理策略:
- ReAct: https://arxiv.org/abs/2210.03629
- CAMEL: https://arxiv.org/abs/2303.17760
- AutoGen: https://arxiv.org/abs/2308.08155
- Self-Consistency: https://arxiv.org/abs/2203.11171
- Sentence-BERT: https://arxiv.org/abs/1908.10084
工程文档:
- FastAPI 文档: https://fastapi.tiangolo.com/
- 项目 Agent 架构详解:docs/agent_architecture.md
- 答辩要点速查:docs/defense_talking_points.md
- 引入任务队列(Celery/RQ)替代进程内后台任务。
- 将 SQLite 升级为 PostgreSQL(生产并发更稳定)。
- 推荐解释卡片可视化(为什么推荐这个人)。
- A/B 测试不同系统提示词与推荐策略。
- 增加管理后台(审计发现任务与对话质量)。
MIT






