电影RAG系统
一个LLM集成电影推荐和分析系统 TypeScript, AWS基岩, 主控程序 (模型上下文协议),以及 SQLite使用RAG(检索增强生成)架构来回答自然语言电影问题,生成个性化推荐,并提供比较分析。
建筑
┌─────────────────────────────────────────────────────────────┐
│ MCP Client (Claude Desktop, etc.) │
│ │ │
│ stdio transport │
└──────────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────────▼──────────────────────────────┐
│ MCP Server │
│ (5 tools registered via zod schemas) │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌──────────────┐ ┌─────────────────┐ │
│ │ Retriever │──▶│ Context │──▶│ Generator │ │
│ │ (SQL-based) │ │ (formatter) │ │ (Bedrock LLM) │ │
│ └──────┬──────┘ └──────────────┘ └─────────────────┘ │
│ │ │
│ ┌──────▼──────────────────────────────────────────────┐ │
│ │ SQLite (better-sqlite3) │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │ │
│ │ │ movies │ │ ratings │ │ enriched_movies │ │ │
│ │ │ (45k) │ │ (100k) │ │ (75, LLM-gen) │ │ │
│ │ └──────────┘ └──────────┘ └──────────────────┘ │ │
│ │ movies.db ratings.db (ATTACH DATABASE) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘技术栈
- TypeScript (ES2022,NodeNext模块)
- AWS基岩 --LLM推理
ConverseCommand(亚马逊Nova Pro) - 模型上下文协议(MCP) --通过stdio传输的工具服务器
- SQLite —
better-sqlite3跨数据库ATTACHfor joins - 萨德 --MCP工具输入的运行时模式验证
设置
先决条件
- Node.js 24+(通过 非易失性存储器)
- AWS CLI配置了
dev-bedrock具有基岩通道的剖面图 - 访问亚马逊Nova Pro(或其他基岩型号)
安装
nvm install 24
nvm use 24
npm install
cp .env.example .env
# Edit .env if needed (defaults to Nova Pro in us-east-1)
# Copy source databases into working directory
cp -r db_original dbAWS简介
该系统使用 dev-bedrock AWS CLI配置文件。确保它存在于 ~/.aws/credentials:
[dev-bedrock]
aws_access_key_id = YOUR_KEY
aws_secret_access_key = YOUR_SECRETNPM脚本
| 脚本 | 描述 |
|---|---|
npm run dev | 打印CLI使用情况 |
npm run enrich | 运行富集管道(75部电影) |
npm run reset-enrichment | 清除富集数据以重新运行 |
npm run mcp | 启动MCP工具服务器(stdio) |
npm run build | 将TypeScript编译为 dist/ |
npm start | 运行编译的JavaScript |
npm run lint | 在上运行ESLint src/ |
npm run format | 运行Prettier src/ |
用法
数据丰富
使用LLM生成的属性丰富75部顶级电影:
npm run enrich这创建了一个 enriched_movies 桌上 movies.db 每部电影有5个AI生成的属性(参见 丰富属性 在......下面
要重新运行富集(例如,使用不同的模型):
npm run reset-enrichment # Clears existing enrichment data
npm run enrich # Re-generates with current modelMCP服务器
启动MCP工具服务器:
npm run mcp使用任何MCP客户端进行连接。用于测试 MCP检查员:
npx @modelcontextprotocol/inspector node_modules/.bin/tsx src/index.ts mcp验证脚本
富集后,验证数据:
./scripts/test-enrichment.sh数据库模式
movies 表(movies.db)--约45000部电影
| 列 | 类型 | 注释 |
|---|---|---|
| movieId | INTEGER | 主键 |
| imdbId | 文本 | |
| title | 文本 | |
| 概述 | 文本 | 绘图摘要 |
| 生产公司 | TEXT | JSON数组 {id, name} 物体 |
| 发布日期 | 文本 | |
| 预算 | 整数 | 美元(未知时为0) |
| 收入 | 整数 | 美元(如果未知,则为0) |
| 运行时间 | 整数 | 分钟 |
| 语言 | 文本 | |
| 流派 | TEXT | JSON数组 {id, name} 物体 |
| 状态 | 文本 |
ratings 表(ratings.db)--约100000个评级
| 列 | 类型 | 注释 |
|---|---|---|
| ratingId | 整数 | 主键 |
| 用户ID | 整数 | |
| movieId | INTEGER | FK到电影 |
| 评级 | 真实 | 0.5-5.0分 |
| 时间戳 | 整数 | Unix时间戳 |
enriched_movies 表(movies.db)--由创建 npm run enrich
| 列 | 类型 | 约束 |
|---|---|---|
| movieId | INT | 主键 |
| 情绪 | 文本 | 签到(积极、消极、中立) |
| 感伤推理 | 文本 | |
| budget层 | 文本 | 签入(低、中、高) |
| 预算层次推理 | 文本 | |
| revenueTier | 文本 | 签入(低、中、高) |
| 收入层次推理 | 文本 | |
| 生产效率评分 | 真实值 | 检查在1到10之间 |
| 有效性调整 | 文本 | |
| 受众吸引力 | 文本 | 签到(广泛、小众、邪教) |
| 受众感知推理 | 文本 | |
| rawLlmResponse | TEXT | 用于可审计性的完整LLM输出 |
| enrichedAt | TEXT | 时间戳 |
丰富属性
富集管道将每部电影的数据发送到AWS Bedrock并使用 tool_use (强制工具调用)以提取结构化属性:
| 属性 | 值 | 描述 |
|---|---|---|
| 情绪 | 正面/负面/中性 | 电影概述文本的基调 |
| 预算级别 | 低/中/高 | 基于生产预算的分类(\7500万美元) |
| 收入等级 | 低/中/高 | 基于票房收入的分类(\3亿美元) |
| 生产效率 | 1-10分 | 用户评分、预算效率(ROI)和质量的综合 |
| 受众吸引力 | 广泛/小众/邪教 | 目标受众类型(主流vs专业vs热情的少数群体) |
每个属性都包括LLM生成的解释分类的推理。
MCP工具
MCP服务器公开了5个工具,每个工具都遵循RAG模式(检索→ 增强→ 生成):
| 工具 | 说明 |
|---|---|
search_movies | 按类型、年份、预算/收入级别、情绪、观众吸引力或关键字过滤电影 |
recommend_movies | 基于用户评分历史的个性化推荐 |
summarize_user_preferences | 根据用户的评分生成口味档案 |
compare_movies | 2-5部电影在多个维度上的并排比较 |
query_movies | 自然语言问题——LLM提取过滤器、检索数据、生成答案 |
查询示例
"Recommend action movies with high revenue and positive sentiment"
"Summarize preferences for user 1"
"Compare Star Wars and Jurassic Park"
"What are the most profitable low-budget movies?"RAG架构
每个MCP工具都遵循 检索增强生成 图案:
- 检索 --SQL查询
movies.db和ratings.db(通过以下方式加入ATTACH DATABASE).对于query_movies,LLM首先使用以下公式从自然语言问题中提取结构化过滤器tool_use.
- 增强 --检索到的数据被格式化为结构化文本上下文,其中包含电影详细信息、评级、丰富属性和用户历史记录(视情况而定)。
- 生成 --增强的上下文将通过特定于任务的系统提示发送到AWS Bedrock。LLM生成基于数据的对话式响应。
项目结构
src/
├── index.ts # CLI entry point (enrich | reset-enrichment | mcp)
├── config.ts # Bedrock client, env vars, DB paths
├── types.ts # TypeScript interfaces
├── db/
│ ├── connection.ts # SQLite singleton + ATTACH DATABASE
│ ├── movies.ts # Movie queries with JSON parsing
│ ├── ratings.ts # Rating queries + user preference stats
│ └── enriched.ts # Enriched movies table CRUD + stats
├── enrichment/
│ ├── prompts.ts # System prompt + Bedrock tool_use schema
│ └── pipeline.ts # Batch enrichment pipeline with retry
├── rag/
│ ├── retriever.ts # SQL-based retrieval for each tool
│ ├── context.ts # Format data as LLM context strings
│ └── generator.ts # Bedrock Converse calls for responses
└── mcp/
├── server.ts # MCP server setup (stdio transport)
└── tools.ts # 5 tool definitions + handlers设计决策
看 JOURNEY.md 了解架构选择、模型选择和经验教训的详细原理。
