摘要(导语)
我自己做了一个开源的智能音乐推荐 Agent,基于 LangGraph 工作流与硅基流动 LLM,提供自然语言多维度音乐推荐(心情/场景/流派/相似歌曲等),前端采用 Streamlit,开箱即用。文章将从架构、核心流程、关键模块到部署与扩展(含 MCP/Spotify 集成)进行系统讲解,并给出可直接运行的示例代码与配置模板。
- 关键词:音乐推荐、LangGraph、大模型应用、硅基流动、Streamlit、MCP
- 适读人群:AI 应用开发者、推荐系统从业者、原型/课题研究人员
- 项目地址:https://github.com/imagist13/Muisc-Research
求求大家为我的仓库点个star,我之后会不断更新该项目,同时也期待大家提交PR。
一个基于AI的智能音乐推荐系统,使用LangGraph构建,支持自然语言交互和个性化推荐。
🎯 智能理解心情、场景、流派等需求,一键生成推荐歌单
🔍 集成搜索、推荐与解释,让你知道每首歌的推荐理由
⚙️ 基于 LangGraph + Streamlit,轻量部署即可运行
🔐 支持自定义 LLM(DeepSeek、Qwen 等)与本地音乐数据
目录
- 一、项目简介
- 二、快速上手(5 分钟跑通)
- 三、系统架构
- 四、核心流程(从意图到结果)
- 五、关键模块详解
- 六、示例代码(启动与 API 调用)
- 七、进阶能力:MCP/Spotify 集成
- 八、测试与故障排查
- 九、性能与演进方向
- 十、开源信息与参考资料
- 附录:setting.json 最小配置模板
一、项目简介
- 项目定位:一个能“听懂你”的音乐推荐 Agent。支持心情、场景、流派、艺术家、相似歌曲等多维度推荐,并输出可解释理由。
-
技术选型:
- LangGraph + LangChain:工作流编排与 LLM 应用框架
- 硅基流动(SiliconFlow):DeepSeek/Qwen 等模型服务
- Streamlit:轻量 Web UI
- Python + asyncio + Pydantic:后端与数据校验
-
使用场景:原型开发、A/B 测试、课程/分享 Demo、课题研究。
二、快速上手(5 分钟跑通)
# 1. 克隆并进入目录
git clone <your-repo-url>
cd deep-search
# 2. 安装依赖
pip install -r requirements.txt
# 3. 添加配置(见文末 setting.json 模板)
# 4. 启动 Web 应用
python run_music_app.py
启动后访问:http://localhost:8501
常见交互示例:
- “我现在心情很好,推荐一些开心的音乐”
- “适合运动时听的音乐”
- “搜索周杰伦的歌曲”
- “有没有类似《晴天》的歌曲”
三、系统架构
- 插图位(建议:系统组件架构图)
- 建议包含:User、Streamlit UI、Agent(LangGraph)、LLM(SiliconFlow)、Tools、本地数据源或外部音乐 API
模块划分:
config/:配置加载(支持setting.json与环境变量)llms/:LLM 抽象与硅基流动实现(OpenAI 兼容)graphs/:音乐推荐工作流图与状态管理prompts/:提示词tools/:音乐工具与 MCP 适配music_agent.py:Agent 主入口music_app.py:Streamlit 前端data/music_database.json:本地数据(可替换实际 API)
四、核心流程(从意图到结果)
- 插图位(建议:流程图/时序图)
- 用户输入自然语言
- 意图识别
analyze_intent - 意图路由
route_by_intent- search / recommend_by_mood / recommend_by_activity / recommend_by_genre / recommend_by_artist / general_chat
- 分支节点处理:搜索/推荐/聊天
- 生成可解释结果(推荐理由/结构化 JSON)
- Web 展示与交互
五、关键模块详解
- 配置管理
config/settings_loader.py- 优先从
setting.json读取,回退到环境变量 - 统一注入 API Key、Base URL、默认模型等
- 优先从
- LLM 封装
llms/siliconflow_llm.py- 使用 OpenAI 兼容客户端 + 硅基流动 Base URL
- 便于更换模型或供应商,业务侧零侵入
- 工作流
graphs/music_graph.py- 定义状态、节点与路由;将“意图理解 → 任务执行 → 结果生成”模块化
- 工具层
tools/- 搜索、相似度、推荐引擎能力
- MCP 适配(后续对接外部 API/工具)
- 前端
music_app.py- 输入 + 结果卡片/列表 + 理由
- 侧边栏快捷按钮(心情/场景/流派)
六、示例代码(启动与 API 调用)
- 启动脚本片段(自动检查环境变量并启动 Streamlit):
# run_music_app.py(节选)
def main():
print("=" * 60)
print("🎵 音乐推荐Agent - 启动中...")
print("=" * 60)
if not check_env():
sys.exit(1)
print("\n正在启动Streamlit应用...")
print("访问地址: http://localhost:8501")
subprocess.run([
sys.executable, "-m", "streamlit", "run", "music_app.py",
"--server.headless=true"
])
- Python API 使用:
import asyncio
from music_agent import MusicRecommendationAgent
async def main():
agent = MusicRecommendationAgent()
result = await agent.get_recommendations("我现在心情很好,推荐一些开心的音乐")
print(result["response"])
search_result = await agent.search_music("周杰伦", genre="流行")
for song in search_result["results"]:
print(f"{song['title']} - {song['artist']}")
asyncio.run(main())
七、进阶能力:MCP/Spotify 集成
- MCP Server(示例位于
mcp/)siliconflow_server.py:将硅基流动能力以 MCP 工具暴露music_server_updated_2025.py:更完整的音乐工具集合
- 对接 Spotify/网易云(规划/可行性)
- 使用官方 API 获取检索/音频特征/艺人画像
- 将检索与相似度计算外包给外部服务,提升覆盖与准确率
八、测试与故障排查
- 建议测试项:
- 意图识别正确率(多样化输入)
- JSON 输出校验(字段/类型/长度)
- 超时与重试策略、网络异常处理
- 常见问题:
- 未设置
SILICONFLOW_API_KEY:请在setting.json或环境变量中配置 - Streamlit 启动失败:尝试
streamlit run music_app.py - 返回格式不规范:检查提示词或在工作流增加 JSON 清洗步骤
- 未设置
九、性能与演进方向
- 性能优化:
- 模型/温度/上下文裁剪
- 缓存与去重(相同意图/相似请求)
- 前端分页与懒加载
- 可演进方向:
- 实时对接音乐 API(检索/音频特征)
- 播放与歌单管理
- 长期偏好学习(向量检索 + 反馈闭环)
- 多模态信号(封面图、歌词情感分析)
- 子图/策略拆分与多模型协同
十、开源信息与参考资料
- 许可证:MIT
- 主要依赖:LangGraph、LangChain、openai/兼容客户端、Streamlit、Pydantic、asyncio
- 参考:
- LangGraph 官方文档
- 硅基流动 API 文档
- Streamlit 文档
- Spotify/网易云开放平台文档(如需)
附录:setting.json 最小配置模板
{
"SILICONFLOW_API_KEY": "",
"SILICONFLOW_BASE_URL": "https://api.siliconflow.cn/v1",
"SILICONFLOW_CHAT_MODEL": "Qwen/Qwen2.5-72B-Instruct",
"TAILYAPI_API_KEY": "",
"TAILYAPI_BASE_URL": "https://api.tavily.com",
"APP_NAME": "DeepSearch Quickstart",
"SPOTIFY_CLIENT_ID": "",
"SPOTIFY_CLIENT_SECRET": ""
}
文末 CTA
如果你对“能听懂你”的音乐推荐系统感兴趣,欢迎 Star、Fork 与交流。也欢迎在评论区分享你的使用体验或改进建议,一起把这个 Agent 打磨成可落地、可扩展的高质量 AI 应用。 Githup仓库地址:github.com/imagist13/M…