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

229 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 表:`models`id, 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
```sql
-- 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}`