乐于分享
好东西不私藏

AI Agent 面试题日报(Day4)- AI Agent 实战应用:LangGraph · RAG 架构 · 本地 音乐

AI Agent 面试题日报(Day4)- AI Agent 实战应用:LangGraph · RAG 架构 · 本地 音乐

今日聚焦三大实战主题,结合真实技术栈(LangGraph + Qdrant + Apple Silicon),助你掌握工业级 Agent 开发要点。


题目一

🔧 如何用 LangGraph 构建一个带 RAG 的 Agent 系统?


答案要点

1. 核心架构

用户输入 → Embedding → Qdrant 向量检索 → LangGraph 编排 → LLM 生成

2. 技术栈选型

组件
选型
说明
Embedding
BAAI/bge-large-zh-v1.5
中文最强开源,1024 维
向量库
Qdrant (Docker)
本地部署,支持 GPU 加速
LLM
qwen3.5:35b (Ollama)
本地运行,无需 API Key
编排
LangGraph
状态机管理 Agent 流程

3. 核心代码结构

from langgraph.graph import StateGraph, START, ENDfrom typing import TypedDictclass AgentState(TypedDict):    question: str      # 用户问题    docs: list[str]    # 检索到的文档    answer: str        # 最终答案    steps: list[str]   # 执行步骤def retrieve(state: AgentState) -> AgentState:    """向量检索节点"""    from qdrant_client import QdrantClient    qdrant = QdrantClient(host="localhost", port=6333)    results = qdrant.query_points(        collection_name="knowledge_base",        query=embed(state["question"]),  # BGE 嵌入        limit=3,        with_payload=True    ).points    docs = [hit.payload["content"for hit in results]    return {"docs": docs, "steps": state["steps"] + ["retrieve"]}def generate(state: AgentState) -> AgentState:    """LLM 生成节点"""    prompt = f"问题:{state['question']}\n\n参考资料:\n" + "\n\n".join(state["docs"])    response = llm.invoke(prompt)    return {"answer": response.content, "steps": state["steps"] + ["generate"]}# 构建图graph = StateGraph(AgentState)graph.add_node("retrieve", retrieve)graph.add_node("generate", generate)graph.add_edge(START, "retrieve")graph.add_edge("retrieve""generate")graph.add_edge("generate", END)app = graph.compile()

4. 关键踩坑记录

原因
解决方案
Python 3.9 不支持
模板要求 >= 3.10
用 ~/.hermes-venv/bin/python3.11
Qdrant 版本不匹配
client 1.16.1 vs server 1.18.0
加 check_compatibility=False
向量维度错误
旧 collection 维度不一致
删掉重建:curl -X DELETE .../collections/knowledge_base
无输出
Python stdout 全缓冲
加 PYTHONUNBUFFERED=1

题目二

🎵 如何在 Apple Silicon Mac 上构建本地 AI 音乐生成 Pipeline?


答案要点

1. 方案对比

方案
歌词
人声
成本
适用场景
MusicGen
免费
纯音乐、背景音
Suno
$10/月
完整歌曲
HeartMuLa
免费
本地(需 CUDA)

2. 本地 MusicGen 实战

from audiocraft.models import MusicGen# 模型选择(内存占用)# small ~2GB | medium ~4GB | large ~8GBmodel = MusicGen.get_pretrained('facebook/musicgen-medium')model.set_generation_params(duration=30)  # 最长 30 秒# 生成纯音乐wav = model.generate(["romantic piano ballad, soft and dreamy"])3. 完整混音 Pipeline(Edge-TTS + MusicGen + FFmpeg)Edge-TTS (人声) → MusicGen Small (伴奏) → FFmpeg (混音) → MP3 成品# Step 1: Edge-TTS 生成中文人声(无需下载模型)import edge_ttscommunicate = edge_tts.Communicate("你好,这是一段测试语音""zh-CN-XiaoxiaoNeural")await communicate.save("vocal.mp3")# Step 2: MusicGen 生成伴奏wav = model.generate(["romantic piano ballad"])torchaudio.save("background.wav", wav[0].cpu(), sample_rate=32000)# Step 3: FFmpeg 混音# ffmpeg -y -i background.wav -i vocal.wav \#   -filter_complex '[0:a]volume=0.3[bg]; [1:a]volume=1.0[vo]; [bg][vo]amix' final.mp3

4. 关键技术细节

  • FFmpeg 音量参数:volume=0.3 表示 30% 音量,不是分贝值
  • MusicGen 限制:每次最多 30 秒,需要拼接
  • 国内下载:用清华镜像 + hf-mirror.com,删 .incomplete 后重试

题目三

📋 如何设计一个支持多 Agent 协作的系统?结合 LangGraph 状态机实现


答案要点

1. 多 Agent 协作架构

用户  ↓┌─────────────────────────────┐│     Orchestrator Agent       │ ← 中央调度│  (意图识别 + 任务分发)       │└──────────┬──────────────────┘           ↓    ┌──────┼──────┬──────┐    ↓      ↓      ↓      ↓ 检索  写代码  画图  音乐  ... ← 专业 Agent    ↓      ↓      ↓      ↓    └──────┴──────┴──────┘           ↓    ┌─────────────────┐    │  结果整合 Agent  │ ← 汇总输出    └─────────────────┘

2. LangGraph 条件分支实现

class MultiAgentState(TypedDict):    task: str    intent: str           # 识别到的意图    sub_results: dict     # 各 Agent 返回结果    final_answer: strdef triage(state: MultiAgentState) -> MultiAgentState:    """意图识别 + 路由"""    intent = llm.invoke(f"判断任务类型:{state['task']}")    return {"intent": intent, "steps": state["steps"] + ["triage"]}def route_by_intent(state: MultiAgentState) -> str:    """条件路由"""    intent = state["intent"].lower()    if "代码" in intent or "code" in intent:        return "code_agent"    elif "画" in intent or "图" in intent:        return "image_agent"    elif "音乐" in intent or "歌" in intent:        return "music_agent"    else:        return "search_agent"# 构建条件图graph = StateGraph(MultiAgentState)graph.add_node("triage", triage)graph.add_node("code_agent", code_agent)graph.add_node("image_agent", image_agent)graph.add_node("music_agent", music_agent)graph.add_node("search_agent", search_agent)graph.add_node("synthesize", synthesize)graph.add_edge(START, "triage")graph.add_conditional_edges("triage", route_by_intent)# ... 各 Agent 汇合到 synthesize

3. 思考维度

维度
考量
通信协议
Agent 间如何传递信息?共享状态 vs 消息队列
错误处理
单个 Agent 失败时如何回退或重试
资源控制
并发数限制、API 调用频率控制
可观测性
如何追踪整个协作流程?LangGraph 支持查看执行历史
扩展性
新增 Agent 类型如何不影响现有架构