langchain-learning-kit/langchain-learning-kit.md

7.2 KiB
Raw Blame History

LangChain 学习平台langchain-learning-kit

目标:提供一个企业级目录结构简洁可运行的示例系统,用来学习 LangChain 的关键功能MySQL 配置与持久化、模型管理(可切换 LLM、知识库管理向量库 + 元数据、多轮对话会话状态、自定义智能体Agent、以及常用运维/安全/测试准备。设计偏教学但架构接近生产可演示性。


一、总体概览

  • 用户 → 前端/CLI → API Server (FastAPI) → 服务层:
    • Auth & UserManagerMySQL
    • ModelManagerLLM 配置/版本)
    • KnowledgeBaseManager向量索引 + 文档元数据)
    • ConversationManager会话/历史)
    • Agent OrchestratorRAG + 多工具)
    • Jobs / Workers异步任务索引、embed、清理
  • 向量存储FAISS本地
  • EmbeddingsOpenAI
  • LLMOpenAI
  • 持久化MySQL元数据、用户、会话索引等 + 本地磁盘或 S3FAISS 索引快照、文档原文)

二、技术选型

  • 后端框架FastAPI
  • LangChain核心库 + langchain-communityVectorstores
  • 向量 DBFAISS本地开发
  • Embeddings/LLMOpenAI示例兼容层支持自托管模型via ModelManager
  • 异步任务Celery / RQ演示可用内置 asyncio
  • 数据库MySQL演示使用 SQLAlchemy + Alembic
  • Docker容器化
  • CIpytest + GitHub Actions
  • 配置管理dotenv / Env vars
  • 日志/监控结构化日志uvicorn/structlog、Prometheus可选

三、关键组件说明

1. ModelManager模型管理

职责:

  • 管理可用的 embedding 模型与 LLM名称、type、endpoint、apikey、可用状态
  • 提供统一接口 get_embedding_provider(name) / get_llm(name)
  • 支持“默认模型”与按请求切换模型 示例 DB 表:modelsid, name, type (embedding|llm), config JSON, status, created_at

2. KnowledgeBaseManager知识库/向量管理)

职责:

  • 管理多个知识库kb每个 kb 对应一套文档集合和向量索引
  • 提供接口:create_kb(name), ingest_documents(kb, docs), query_kb(kb, query, k)
  • 支持本地 FAISS 索引持久化:save_local(kb), load_local(kb)
  • 元数据保存在 MySQLdocument 表id, kb_id, title, source, content, embedding_id,...
  • 支持分片、版本snapshot

3. ConversationManager多轮对话

职责:

  • 管理会话对象session_id, user_id, messages[], metadata
  • 提供 conversation memory短期与长期
  • 支持将检索到的片段注入 promptRAG
  • 支持对话转写为文档入库(长期记忆)

DB 表:conversations (id, user_id, title, created_at)messages (id, conversation_id, role, text, metadata, created_at)

4. Agent Orchestrator自定义智能体

职责:

  • 将 LangChain Agent 与工具retriever、calculator、external API组合
  • 提供 Agent 模板配置:工具集合、策略(单步/多步/chain-of-thought 开/关)
  • 记录 agent_scratchpad 用于审计与回溯
  • 提供 API 启动/停止智能体、获取工具调用日志

5. Jobs / Workers

职责:

  • 异步嵌入计算batch embedding、文档分块、定期 reindex
  • 可使用 Celery + Redis或简单的线程池实现

四、MySQL 设计(简化版 schema

-- models: 存放模型信息embedding/llm
CREATE TABLE models (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(128) NOT NULL,
  type VARCHAR(32) NOT NULL, -- 'embedding' or 'llm'
  config JSON NOT NULL,      -- 存放 endpoint/api_key/其他配置
  is_default BOOLEAN DEFAULT FALSE,
  status VARCHAR(32) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- knowledge bases
CREATE TABLE knowledge_bases (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(128) UNIQUE,
  description TEXT,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- documents
CREATE TABLE documents (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  kb_id INT,
  title VARCHAR(512),
  content LONGTEXT,
  source VARCHAR(512),
  metadata JSON,
  embedding_id VARCHAR(128),  -- 可选 linkage 到向量存储的 id
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (kb_id) REFERENCES knowledge_bases(id)
);

-- conversations + messages
CREATE TABLE conversations (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  user_id INT,
  title VARCHAR(255),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE messages (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  conversation_id BIGINT,
  role VARCHAR(32),   -- user, assistant, system, tool
  content LONGTEXT,
  metadata JSON,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (conversation_id) REFERENCES conversations(id)
);

-- audit log for agent/tool calls
CREATE TABLE tool_calls (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  agent_id VARCHAR(128),
  tool_name VARCHAR(128),
  call_input JSON,
  call_output JSON,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

五、目录结构(企业级示例)

langchain-learning-kit/
├── docker/
│   ├── Dockerfile
│   ├── docker-compose.yml
│   └── nginx/
├── app/
│   ├── main.py                    # FastAPI entry
│   ├── config.py
│   ├── api/
│   │   ├── v1/
│   │   │   ├── models.py          # model management endpoints
│   │   │   ├── kb.py              # knowledge base endpoints
│   │   │   ├── conv.py            # conversation endpoints
│   │   │   └── agent.py           # agent endpoints
│   ├── services/
│   │   ├── model_manager.py
│   │   ├── kb_manager.py
│   │   ├── conv_manager.py
│   │   └── agent_orchestrator.py
│   ├── db/
│   │   ├── models.py              # SQLAlchemy models
│   │   ├── session.py
│   │   └── alembic/
│   ├── embeddings/
│   │   ├── openai_provider.py
│   │   └── providers.py
│   └── utils/
│       ├── text_splitter.py
│       ├── faiss_helper.py
│       └── logger.py
├── tests/
│   ├── unit/
│   └── integration/
├── docs/
│   ├── architecture.md
│   └── runbook.md
├── scripts/
│   ├── ingest_docs.py
│   └── reindex_faiss.py
├── .env
├── requirements.txt
└── README.md

六、关键 API 设计

1. Model 管理

  • POST /api/v1/models — 添加模型body: name,type,config
  • GET /api/v1/models — 列表
  • PUT /api/v1/models/{id} — 更新
  • DELETE /api/v1/models/{id}

2. 知识库

  • POST /api/v1/kb — 创建知识库
  • POST /api/v1/kb/{kb_id}/ingest — 上传文档(文本/URL触发分割+嵌入(异步)
  • POST /api/v1/kb/{kb_id}/query — queryquery, model, k
  • GET /api/v1/kb/{kb_id}/status — index 状态

3. 会话

  • POST /api/v1/conversations — 新会话
  • POST /api/v1/conversations/{id}/messages — 追加消息(会触发 RAG/Agent
  • GET /api/v1/conversations/{id} — 获取对话历史

4. Agent

  • POST /api/v1/agent/run — {agent_name, input, model?}
  • GET /api/v1/agent/logs/{run_id}