Skip to content
BenJoangPublic

About

基于Langgraph的 个人agent项目

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Repository files navigation

LLM-Graph:工具执行、上下文管理与 SQL 对话存储组成的个人 Agent 工作台

LLM-Graph

从一次工具调用,到一段有记忆的工作流。
基于 LangGraph 的个人 Agent 工作台,把文件、Shell、子 Agent、多模态与日常小工具接到同一条执行链上。

Python 3.12 LangGraph Electron + React SQLite / PostgreSQL MIT License

能力地图 · 架构设计 · 快速开始 · 知识库检索 · 开发与验证

项目起点:这是我第一个认真做的小项目。参考其他开源 Agent 框架,在 AI 辅助理解的过程中自己梳理代码逻辑,逐步做成可以复用的个人工作流。它既服务于日常任务,也保留了一点 QQ 机器人和 TTS 的娱乐性。

01 · 能力地图

Tool Use → Subagent → Context Engineering → Conversation Store → CLI / API / Desktop

能力模块 已实现的闭环 对应实现
工具执行 · ReAct 模型决策 → 文件读取 / 目录查询 / 文本搜索 / Shell → 工具结果 → 后续决策 tool_agent_graph、tools
子 Agent · Task Delegation 主 Agent 拆出任务,向子 Agent 注入模型、工作目录、工具集与上下文预算,回收结构化结果 Agenttool、sub_agent_graph
上下文 · Context Engineering 工具返回裁剪 + 历史摘要;模型上下文超限后执行三级递进压缩重试,异步调用支持取消 context
对话存储 · SQL Event Log Session → Run → 完整消息事件 → 上下文投影;SQLite / PostgreSQL 双后端,完成轮次进入后续上下文 conversation_store、runner
检索 · Hybrid RAG 文档切片 → 并发 Embedding → pgvector;向量召回与 BM25 通过 RRF 融合,提供 Hit@K / MRR 评估 rag、evals
工作台 · Desktop & API Electron + React 连接本地 FastAPI,SSE 展示运行事件;管理会话、模型、工作目录与取消操作 desktop、api
多模态与场景 Graph 图像理解、QQ 群历史检索与角色对话、TTS 工作流;通过 Skill 描述复用搜索与语音等能力 Imageread、graphs、skills
可观测性 · Tracing 可选 Phoenix / OpenInference 追踪,使用 HTTP/protobuf 批量上报 observability

工具注册表包含文件、搜索、Python、Shell、图像、记忆和 Skill 等模块;每个 Graph 显式选择自己的工具与 Skill 集合。QQ 机器人的 NoneBot 宿主位于独立项目,TTS、搜索和本地模型也需要各自的服务配置。

02 · 架构设计

一条执行链,三个交互入口

flowchart TB
    CLI["CLI · 多轮对话"] --> Runner["ToolAgentRunner · 统一运行协调器"]
    GUI["Electron + React"] --> API["FastAPI · HTTP / SSE"]
    API --> Runner
    Runner --> Graph["受管 Graph · Tool Agent / TTS"]
    Graph --> Model["模型客户端 · Qwen / DeepSeek"]
    Model --> Tools["文件 / Grep / Shell / 图像 / 子 Agent"]
    Tools --> Model
    Context["上下文管理 · 裁剪 / 摘要 / 压缩重试"] -.-> Graph
    Skills["SKILL.md · 搜索 / 语音 / 场景说明"] -.-> Graph
    Runner --> Events["SQL · Sessions / Runs / Events / Context"]
    Events --> Runner
    RagCLI["RAG CLI: Ingest / Search / Evaluate"] --> RAG["Knowledge Base: pgvector + BM25 + RRF"]
    classDef entry fill:#E1ECF8,stroke:#7A9BC1,color:#244D77
    classDef engine fill:#F6E5E4,stroke:#C89999,color:#573B45
    classDef storage fill:#E1EFE7,stroke:#87AD96,color:#315F4C
    class CLI,GUI,API,RagCLI entry
    class Runner,Graph,Model,Tools,Context,Skills engine
    class Events,RAG storage
Loading

把“发生过什么”与“模型下一轮读什么”分开

存储层 内容与职责
conversation_sessions 长期会话标识与下一轮编号
conversation_runs 每次请求的运行状态:running → completed / cancelled / failed / interrupted
conversation_events 按消息 ID 幂等追加的完整消息,作为永久对话事实源
conversation_context 已完成轮次的模型上下文投影与压缩状态
outputs/gui_state.sqlite GUI 标题、模型、工作目录等会话元数据

普通 CLI、Tool Agent API 和 GUI 的受管 Graph 以 checkpointer=None 执行。取消、失败和中断的事件会保留,但不进入后续模型上下文或 GUI 正式历史。本地单实例启动时,遗留的 running Run 会被标记为 interrupted。

旧 LangGraph checkpoint 作为历史来源保留,不会自动迁移到新的对话库,也不提供任务执行到一半的自动续跑。

03 · 快速开始

① 安装环境

当前安装与桌面启动脚本面向 Windows,需要 Python 3.12、Node.js LTS 和 npm。本地虚拟环境固定在项目根目录 .venv。

.\setup.ps1

# 首次配置时执行;已有 .env 请直接编辑,保留原配置
Copy-Item .env.example .env

也可以双击 setup.bat。安装脚本会创建 .venv 并安装 Python 与桌面端依赖。

手动安装的等价命令
py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install --upgrade pip
.\.venv\Scripts\python.exe -m pip install -r requirements-LLMv1.txt
npm install --prefix desktop

② 连接模型与对话库

模型 Profile 在 config/user_config.json 中定义,通过 base_url_env 和 api_key_env 读取 .env。例如,CLI 默认使用 deepseekv4-flash:

DEEPSEEK_BASE_URL=https://api.deepseek.com
DEEPSEEK_API_KEY=填入你的API密钥

# 本地对话持久化;普通聊天无需 PostgreSQL 或 Embedding 服务
LLM_GRAPH_DATABASE_URL=sqlite:///outputs/conversations/conversation.sqlite3

也可以选择已配置的 Qwen Profile。本项目负责模型调用;本地 Qwen 的 OpenAI 兼容推理服务需要另行启动。模型名称应与实际服务提供的名称一致,密钥保存在个人 .env 中。

切换 PostgreSQL 或兼容旧配置
LLM_GRAPH_DATABASE_URL=postgresql://user:password@127.0.0.1:5434/database?sslmode=disable

LLM_GRAPH_DATABASE_URL 留空时兼容旧 LLM_GRAPH_CHECKPOINT_* 后端选择;SQLite 对话仍使用独立的 outputs/conversations/conversation.sqlite3。旧 checkpoint 与新业务库的历史不会自动互通。

③ 启动 CLI 或桌面工作台

终端对话

.\.venv\Scripts\python.exe tool_agent_chat.py
命令 用途
/help 查看交互帮助
/thread 显示当前会话 ID
/new 创建空白会话
/save 导出到 outputs/cli_session_snapshot.json
/exit 或 /quit 退出

指定模型与工作目录,或通过同一个业务库中的会话 ID 继续对话:

.\.venv\Scripts\python.exe tool_agent_chat.py `
  --profile deepseekv4-flash `
  --vision-profile qwen3-vl `
  --working-dir .

# 将示例 ID 替换为 /thread 显示的实际值
.\.venv\Scripts\python.exe tool_agent_chat.py --thread-id your-session-id

Windows 桌面工作台

.\start_gui.ps1

也可以双击 start_gui.bat,或执行 npm run dev --prefix desktop。Electron 会启动项目内的 Python 后端,使用随机本地端口与临时访问令牌连接 FastAPI。

桌面会话可选择已注册的 Tool Agent / TTS Graph;有消息后锁定 Graph。同一会话一次运行一个任务,不同会话可同时运行。永久删除会清除业务消息与 GUI 元数据。

单独启动 API / 指定其他 Python 环境
# 默认 http://127.0.0.1:8100;/health 为健康检查,/docs 查看接口
.\.venv\Scripts\python.exe -m src.api.run_chat_api

# GUI 临时使用另一套 Python 3.12 环境
$env:LLM_GRAPH_PYTHON = "C:\path\to\venv\Scripts\python.exe"
.\start_gui.ps1

04 · 从文档到混合检索

Text → Chunking → Concurrent Embedding → PostgreSQL / pgvector → Vector + BM25 → RRF → Evaluation

RAG 是独立的知识库链路,需要 PostgreSQL + pgvector 和兼容 OpenAI 的 Embedding 服务。当前示例使用 qwen3-embedding-0.6b、1024 维;模型服务输出与数据库向量列必须保持一致。

RAG_POSTGRES_URL=postgresql://user:password@127.0.0.1:5434/database?sslmode=disable
RAG_EMBEDDING_BASE_URL=http://127.0.0.1:8001/v1
RAG_EMBEDDING_API_KEY=填入你的Embedding服务密钥
RAG_EMBEDDING_MODEL=qwen3-embedding-0.6b
RAG_EMBEDDING_DIMENSIONS=1024

服务和表结构准备好后,在项目根目录运行:

# 以 README 作为入库示例
.\.venv\Scripts\python.exe -m src.rag.ingest_cli README.md `
  --tenant-id study --document-id readme

# 混合检索
.\.venv\Scripts\python.exe -m src.rag.hybrid_search_cli "如何启动桌面工作台" `
  --tenant-id study --top-k 5

# 按用例比较纯向量与混合检索;先入库用例所依赖的文档
.\.venv\Scripts\python.exe -m src.rag.evaluate_cli --top-k 3

评估用例保存在 evals/rag_cases.json,输出 Hit@1、Hit@K、MRR。BM25 当前逐次加载租户文档块并构建索引,适合小规模个人知识库。PostgreSQL 与 Embedding 服务需单独准备。

05 · 开发与验证

找到你要改的那一层

LLM-Graph/
├── tool_agent_chat.py       # CLI 入口
├── config/                  # 模型 Profile、提示词与生成参数
├── src/
│   ├── graphs/              # Tool Agent、子 Agent、QQ、TTS 等 Graph
│   ├── tools/               # 工具实现、参数 Schema、注册与提示词
│   ├── context/             # 工作目录、项目指令、Skill 与上下文压缩
│   ├── services/            # 统一 SQL 对话运行协调器
│   ├── persistence/         # 业务存储、消息编解码与旧 checkpoint 适配
│   ├── rag/                 # 入库、检索与评估
│   ├── api/                 # FastAPI、GUI 会话与 SSE 运行接口
│   └── observability/       # 可选 Phoenix tracing
├── desktop/                 # Electron + React + TypeScript
├── skills/                  # 搜索、语音、场景任务等 Skill
├── tests/                   # Python 测试
├── evals/                   # 检索评估用例
└── outputs/                 # 本地数据库、导出与运行产物

新增工具:使用脚手架生成 InputSchema / execute / prompt.md,实现后在 registry.py 注册,再加入所需 Graph 的工具列表。

.\.venv\Scripts\python.exe -m src.tools.create_tool my_tool --execution async

新增 Graph:参考 tool_agent_graph.build_graph() 保留通用状态与工具链;接入 CLI / GUI 的受管执行时,在 MANAGED_GRAPH_BUILDERS 中注册,由 Runner 管理 SQL 状态。

新增 Skill:在 skills/<name>/SKILL.md 编写名称、描述和任务说明,再按 Graph 的 Skill 列表启用。Skill 描述与脚本、服务依赖需要配套提供。

检查命令

.\.venv\Scripts\python.exe -m pytest tests -q
npm test --prefix desktop
npm run build --prefix desktop
最近一次本机验证 · 2026-10-15 · a41e310
检查范围 结果
真实 DeepSeek Tool Agent 文件工具调用、第二轮记忆、SQL 历史保存通过
临时 SQLite + API 冒烟测试 生命周期、鉴权、会话管理、SSE、历史与归档限制通过;模型输出使用模拟数据
桌面端 TypeScript 检查与构建通过,19 个测试通过
Python 测试 排除迁移测试后,63 通过、4 个 PostgreSQL 测试跳过、1 失败
本机 RAG 服务 PostgreSQL 连接超时,Embedding 服务不可连接;未完成端到端验证

当前仓库有两处已知测试问题:

  • tests/test_checkpoint_migration.py 引用了尚未提交的 scripts/migrate_checkpoint_conversations.py,导致完整测试收集失败。迁移旧历史前需要先补齐脚本;旧数据不会随应用启动自动搬迁。
  • tests/test_shell_tool.py 对报错行号的断言期待第 4 行,当前实际为第 7 行。

可先排除缺失脚本对应的测试运行其余用例,Shell 行号断言仍会失败:

.\.venv\Scripts\python.exe -m pytest tests -q --ignore=tests/test_checkpoint_migration.py

以上为该版本的本机验证记录,不代表所有模型或外部服务的兼容结果。

06 · 继续生长的方向

  • 补齐旧 checkpoint 到 SQL 对话库的迁移脚本与验证。
  • 完善 Skill 接入与外部服务的复现说明。
  • 继续探索桌面操作和游戏等场景工作流。

从“能回答”做到“能调用工具”,再做到“下一轮还记得自己做过什么”。这个项目会继续围绕实际用得上的小任务演进。


MIT License · Built for learning, everyday workflows, and a little fun.

About

基于Langgraph的 个人agent项目

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages