电影推荐与分析系统

一个基于TypeScript、AWS Bedrock、MCP和SQLite构建的LLM集成电影推荐与分析系统,采用RAG架构回答自然语言电影问题、生成个性化推荐并提供比较分析。

  • by StephanieSpanjian
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 StephanieSpanjian/LLM-integrated-movie-recommendation-and-analysis-system

使用说明

电影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 跨数据库 ATTACH for 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 db

AWS简介

该系统使用 dev-bedrock AWS CLI配置文件。确保它存在于 ~/.aws/credentials:

[dev-bedrock]
aws_access_key_id = YOUR_KEY
aws_secret_access_key = YOUR_SECRET

NPM脚本

脚本 描述
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 model

MCP服务器

启动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 (强制工具调用)以提取结构化属性:

属性 值 描述
情绪 正面/负面/中性 电影概述文本的基调
预算级别 低/中/高 基于生产预算的分类(<1500万美元/15-750万美元/>7500万美元)
收入等级 低/中/高 基于票房收入的分类(<5000万美元/50-3亿美元/>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工具都遵循 检索增强生成 图案:

  1. 检索 --SQL查询 movies.db 和 ratings.db (通过以下方式加入 ATTACH DATABASE).对于 query_movies,LLM首先使用以下公式从自然语言问题中提取结构化过滤器 tool_use.

  2. 增强 --检索到的数据被格式化为结构化文本上下文,其中包含电影详细信息、评级、丰富属性和用户历史记录(视情况而定)。

  3. 生成 --增强的上下文将通过特定于任务的系统提示发送到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 了解架构选择、模型选择和经验教训的详细原理。