|
390 | 390 | "cell_type": "markdown", |
391 | 391 | "metadata": {}, |
392 | 392 | "source": [ |
393 | | - "### 方法4: 使用 LangSmith 平台(生产环境推荐)\n", |
| 393 | + "### 方法4: 云端监控平台\n", |
394 | 394 | "\n", |
395 | | - "LangSmith 是 LangChain 官方的监控和调试平台,提供可视化界面。\n", |
| 395 | + "#### 4.1 LangSmith(官方云端平台)\n", |
| 396 | + "\n", |
| 397 | + "LangSmith 是 LangChain 官方的监控和调试平台,**仅提供云端服务**。\n", |
396 | 398 | "\n", |
397 | 399 | "```python\n", |
398 | 400 | "# 1. 安装 LangSmith\n", |
|
418 | 420 | "**获取 API Key:**\n", |
419 | 421 | "1. 访问 [https://smith.langchain.com/](https://smith.langchain.com/)\n", |
420 | 422 | "2. 注册账号\n", |
421 | | - "3. 在设置中创建 API Key\n" |
| 423 | + "3. 在设置中创建 API Key\n", |
| 424 | + "\n", |
| 425 | + "**⚠️ 注意:**\n", |
| 426 | + "- ❌ LangSmith **没有免费的本地化版本**\n", |
| 427 | + "- 💰 企业版提供自托管选项(需要联系销售)\n", |
| 428 | + "- ☁️ 数据会上传到云端\n", |
| 429 | + "\n", |
| 430 | + "---\n", |
| 431 | + "\n", |
| 432 | + "#### 4.2 LangFuse(开源本地化替代方案)⭐\n", |
| 433 | + "\n", |
| 434 | + "**LangFuse** 是一个开源的 LLM 监控平台,可以**完全本地部署**!\n", |
| 435 | + "\n", |
| 436 | + "**安装和使用:**\n", |
| 437 | + "\n", |
| 438 | + "```python\n", |
| 439 | + "# 1. 使用 Docker 本地部署 LangFuse\n", |
| 440 | + "# docker run -d --name langfuse \\\n", |
| 441 | + "# -p 3000:3000 \\\n", |
| 442 | + "# -e DATABASE_URL=\"postgresql://...\" \\\n", |
| 443 | + "# langfuse/langfuse:latest\n", |
| 444 | + "\n", |
| 445 | + "# 2. 安装 Python SDK\n", |
| 446 | + "# pip install langfuse\n", |
| 447 | + "\n", |
| 448 | + "# 3. 配置\n", |
| 449 | + "from langfuse import Langfuse\n", |
| 450 | + "\n", |
| 451 | + "langfuse = Langfuse(\n", |
| 452 | + " public_key=\"your-public-key\",\n", |
| 453 | + " secret_key=\"your-secret-key\",\n", |
| 454 | + " host=\"http://localhost:3000\" # 本地部署地址\n", |
| 455 | + ")\n", |
| 456 | + "\n", |
| 457 | + "# 4. 集成到 LangChain\n", |
| 458 | + "from langfuse.callback import CallbackHandler\n", |
| 459 | + "\n", |
| 460 | + "handler = CallbackHandler(\n", |
| 461 | + " public_key=\"your-public-key\",\n", |
| 462 | + " secret_key=\"your-secret-key\",\n", |
| 463 | + " host=\"http://localhost:3000\"\n", |
| 464 | + ")\n", |
| 465 | + "\n", |
| 466 | + "# 在 LLM 调用时使用\n", |
| 467 | + "llm = ChatOpenAI(..., callbacks=[handler])\n", |
| 468 | + "```\n", |
| 469 | + "\n", |
| 470 | + "**LangFuse 功能:**\n", |
| 471 | + "- ✅ **完全开源**,可自托管\n", |
| 472 | + "- 🏠 **本地部署**,数据不出本地\n", |
| 473 | + "- 📊 **可视化界面**:类似 LangSmith\n", |
| 474 | + "- 💰 **成本追踪**:Token 和费用统计\n", |
| 475 | + "- 🔍 **Trace 查看**:详细的执行轨迹\n", |
| 476 | + "- 👥 **团队协作**:多用户支持\n", |
| 477 | + "- 📈 **性能分析**:延迟、成本分析\n", |
| 478 | + "\n", |
| 479 | + "**部署方式:**\n", |
| 480 | + "1. **Docker Compose**(推荐)\n", |
| 481 | + "2. **Kubernetes**\n", |
| 482 | + "3. **Vercel/Railway**(云端部署)\n", |
| 483 | + "\n", |
| 484 | + "**官网:** [https://langfuse.com/](https://langfuse.com/)\n", |
| 485 | + "\n", |
| 486 | + "---\n", |
| 487 | + "\n", |
| 488 | + "#### 4.3 Phoenix(Arize AI 开源工具)\n", |
| 489 | + "\n", |
| 490 | + "**Phoenix** 是另一个强大的开源 LLM 监控工具。\n", |
| 491 | + "\n", |
| 492 | + "```python\n", |
| 493 | + "# 1. 安装\n", |
| 494 | + "# pip install arize-phoenix\n", |
| 495 | + "\n", |
| 496 | + "# 2. 启动本地服务器\n", |
| 497 | + "import phoenix as px\n", |
| 498 | + "px.launch_app() # 自动打开 http://localhost:6006\n", |
| 499 | + "\n", |
| 500 | + "# 3. 集成到 LangChain\n", |
| 501 | + "from phoenix.trace.langchain import LangChainInstrumentor\n", |
| 502 | + "\n", |
| 503 | + "LangChainInstrumentor().instrument()\n", |
| 504 | + "\n", |
| 505 | + "# 4. 正常使用 LangChain,自动追踪\n", |
| 506 | + "llm = ChatOpenAI(...)\n", |
| 507 | + "result = llm.invoke(\"Hello\")\n", |
| 508 | + "```\n", |
| 509 | + "\n", |
| 510 | + "**Phoenix 特点:**\n", |
| 511 | + "- ✅ 完全开源、本地运行\n", |
| 512 | + "- 🚀 启动简单,一行代码\n", |
| 513 | + "- 📊 实时监控 UI\n", |
| 514 | + "- 🔍 详细的 Trace 可视化\n", |
| 515 | + "- 📈 性能指标分析\n", |
| 516 | + "\n", |
| 517 | + "**官网:** [https://phoenix.arize.com/](https://phoenix.arize.com/)\n" |
422 | 518 | ] |
423 | 519 | }, |
424 | 520 | { |
|
558 | 654 | "cell_type": "markdown", |
559 | 655 | "metadata": {}, |
560 | 656 | "source": [ |
561 | | - "### 📊 监控方法对比\n", |
| 657 | + "### 📊 监控方法全面对比\n", |
| 658 | + "\n", |
| 659 | + "#### 基础监控方法\n", |
| 660 | + "\n", |
| 661 | + "| 方法 | 部署方式 | 优点 | 缺点 | 适用场景 |\n", |
| 662 | + "|------|----------|------|------|----------|\n", |
| 663 | + "| **Agent内打印** | 无需部署 | 简单直接、立即可用 | 代码侵入性强 | 快速调试 |\n", |
| 664 | + "| **Stream模式** | 无需部署 | 实时、无侵入、清晰 | 只能看状态变化 | 开发调试 |\n", |
| 665 | + "| **自定义回调** | 无需部署 | 灵活、可定制 | 需编写回调类 | 复杂监控 |\n", |
562 | 666 | "\n", |
563 | | - "| 方法 | 优点 | 缺点 | 适用场景 |\n", |
564 | | - "|------|------|------|----------|\n", |
565 | | - "| **Agent 内打印** | 简单直接 | 代码侵入性强 | 快速调试 |\n", |
566 | | - "| **Stream 模式** | 实时、无侵入 | 只能看到状态变化 | 开发调试 |\n", |
567 | | - "| **自定义回调** | 灵活、详细 | 需要编写回调类 | 复杂监控需求 |\n", |
568 | | - "| **LangSmith** | 可视化、功能强大 | 需要注册账号 | 生产环境 |\n", |
569 | | - "| **组合方案** | 全面监控 | 输出较多 | 深度调试 |\n", |
| 667 | + "#### 平台监控方案\n", |
| 668 | + "\n", |
| 669 | + "| 方案 | 部署方式 | 数据存储 | 是否开源 | 成本 | 功能 |\n", |
| 670 | + "|------|----------|----------|----------|------|------|\n", |
| 671 | + "| **LangSmith** | ☁️ 云端 | 云端(美国) | ❌ 闭源 | 💰 付费 | ⭐⭐⭐⭐⭐ 最强 |\n", |
| 672 | + "| **LangFuse** | 🏠 本地/云端 | 可选 | ✅ 开源 | 🆓 免费 | ⭐⭐⭐⭐ 强大 |\n", |
| 673 | + "| **Phoenix** | 🏠 本地 | 本地 | ✅ 开源 | 🆓 免费 | ⭐⭐⭐ 实用 |\n", |
| 674 | + "\n", |
| 675 | + "#### 🔐 数据安全对比\n", |
| 676 | + "\n", |
| 677 | + "| 方案 | 数据隐私 | 适合场景 | 推荐指数 |\n", |
| 678 | + "|------|----------|----------|----------|\n", |
| 679 | + "| **LangSmith** | ⚠️ 数据上云 | 可接受云存储的企业 | ⭐⭐⭐ |\n", |
| 680 | + "| **LangFuse** | ✅ 可完全本地 | 数据敏感、金融、医疗 | ⭐⭐⭐⭐⭐ |\n", |
| 681 | + "| **Phoenix** | ✅ 完全本地 | 本地开发、快速调试 | ⭐⭐⭐⭐ |\n", |
| 682 | + "| **自定义方案** | ✅ 完全控制 | 极度敏感数据 | ⭐⭐⭐ |\n", |
570 | 683 | "\n", |
571 | 684 | "### 💡 推荐方案\n", |
572 | 685 | "\n", |
573 | | - "**开发阶段:**\n", |
| 686 | + "#### 📍 根据场景选择\n", |
| 687 | + "\n", |
| 688 | + "**1. 本地开发/调试(推荐 Phoenix):**\n", |
574 | 689 | "```python\n", |
575 | | - "# 组合使用 print + stream\n", |
576 | | - "for step in app.stream(state):\n", |
577 | | - " print(f\"节点: {list(step.keys())[0]}\")\n", |
578 | | - " print(f\"状态: {step}\")\n", |
| 690 | + "# 最简单,一行启动\n", |
| 691 | + "import phoenix as px\n", |
| 692 | + "px.launch_app() # 自动打开监控界面\n", |
| 693 | + "\n", |
| 694 | + "from phoenix.trace.langchain import LangChainInstrumentor\n", |
| 695 | + "LangChainInstrumentor().instrument()\n", |
579 | 696 | "```\n", |
580 | 697 | "\n", |
581 | | - "**生产环境:**\n", |
| 698 | + "**2. 数据敏感/内网环境(推荐 LangFuse):**\n", |
582 | 699 | "```python\n", |
583 | | - "# 启用 LangSmith\n", |
| 700 | + "# 本地部署,功能强大\n", |
| 701 | + "# docker-compose up -d\n", |
| 702 | + "\n", |
| 703 | + "from langfuse.callback import CallbackHandler\n", |
| 704 | + "handler = CallbackHandler(host=\"http://localhost:3000\")\n", |
| 705 | + "llm = ChatOpenAI(..., callbacks=[handler])\n", |
| 706 | + "```\n", |
| 707 | + "\n", |
| 708 | + "**3. 云端企业场景(LangSmith):**\n", |
| 709 | + "```python\n", |
| 710 | + "# 最强功能,无需部署\n", |
584 | 711 | "os.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\n", |
585 | 712 | "os.environ[\"LANGCHAIN_API_KEY\"] = \"your-key\"\n", |
586 | 713 | "```\n", |
587 | 714 | "\n", |
588 | | - "**深度调试:**\n", |
| 715 | + "**4. 快速调试(Stream模式):**\n", |
589 | 716 | "```python\n", |
590 | | - "# 自定义回调 + 详细日志\n", |
591 | | - "callback = DetailedCallbackHandler()\n", |
592 | | - "llm = ChatOpenAI(..., callbacks=[callback])\n", |
593 | | - "```\n" |
| 717 | + "# 无需任何部署\n", |
| 718 | + "for step in app.stream(state):\n", |
| 719 | + " print(f\"节点: {list(step.keys())[0]}\")\n", |
| 720 | + " print(f\"状态: {step}\")\n", |
| 721 | + "```\n", |
| 722 | + "\n", |
| 723 | + "### 🏆 最终推荐\n", |
| 724 | + "\n", |
| 725 | + "- 🥇 **最佳本地化方案**:**LangFuse**(功能最全、开源、可自托管)\n", |
| 726 | + "- 🥈 **最简单本地方案**:**Phoenix**(一行启动、适合开发)\n", |
| 727 | + "- 🥉 **企业云端方案**:**LangSmith**(功能最强、官方支持)\n" |
594 | 728 | ] |
595 | 729 | }, |
596 | 730 | { |
|
0 commit comments