今日聚焦三大实战主题,结合真实技术栈(LangGraph + Qdrant + Apple Silicon),助你掌握工业级 Agent 开发要点。
题目一
🔧 如何用 LangGraph 构建一个带 RAG 的 Agent 系统?
答案要点
1. 核心架构
用户输入 → Embedding → Qdrant 向量检索 → LangGraph 编排 → LLM 生成2. 技术栈选型
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 QdrantClientqdrant = QdrantClient(host="localhost", port=6333)results = qdrant.query_points(collection_name="knowledge_base",query=embed(state["question"]), # BGE 嵌入limit=3,with_payload=True).pointsdocs = [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. 关键踩坑记录
~/.hermes-venv/bin/python3.11 | ||
check_compatibility=False | ||
curl -X DELETE .../collections/knowledge_base | ||
PYTHONUNBUFFERED=1 |
题目二
🎵 如何在 Apple Silicon Mac 上构建本地 AI 音乐生成 Pipeline?
答案要点
1. 方案对比
| MusicGen | ||||
| Suno | ||||
| HeartMuLa |
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: strintent: 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. 思考维度
| 通信协议 | |
| 错误处理 | |
| 资源控制 | |
| 可观测性 | |
| 扩展性 |
夜雨聆风