[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69A0FV86VNPQ7N4Y7N38T37":3,"skill-same:01M69A0FV86VNPQ7N4Y7N38T37":49},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":20,"linkOnly":21,"markdownContent":22,"markdownBody":23,"frontMatter":24,"refName":25,"commitSha":26,"skillDirectory":27,"forksCount":28,"repositoryHtmlUrl":29,"repositoryHomepageUrl":30,"ownerHtmlUrl":31,"ownerBlogUrl":32,"ownerDescription":33,"updatedAt":34,"install":35,"resources":48},"01M69A0FV86VNPQ7N4Y7N38T37","local-ai-agents",null,"microsoft\u002Fai-agents-for-beginners","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M6998ZK2275KMJE6Y5SEA2X2",79567,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fzh-CN\u002F.agents\u002Fskills\u002Flocal-ai-agents\u002FSKILL.md",[],[18,19],"ai agents","local ai agents","2026-11-10 10:12:30",false,"---\nname: local-ai-agents\nlicense: MIT\n---\n# 使用 Foundry Local 和 Qwen 创建本地 AI 代理\n\n> 伴随 [第17课 – 创建本地 AI 代理](..\u002F..\u002F..\u002F17-creating-local-ai-agents\u002FREADME.md) 的附加技能。\n> 用它来帮助学习者构建一个能够推理、调用工具并且\n> 完全在他们自己的机器上搜索文档的代理——无云推理。所有\n> 建议均基于课程内容和可运行的笔记本。\n\n## 触发条件\n\n当学习者希望：\n- 由于隐私、成本或离线需求而\u003Cstrong>完全在设备上运行\u003C\u002Fstrong>代理时。\n- 使用 **Foundry Local** 在本地部署模型，并通过 OpenAI 兼容端点进行连接。\n- 使用 \u003Cstrong>Qwen 函数调用\u003C\u002Fstrong>模型来驱动可靠的本地工具调用时。\n- 添加 **本地 RAG**（Chroma）或 **本地 MCP 服务器**。\n- 设计一个\u003Cstrong>混合型\u003C\u002Fstrong>本地\u002F云路由策略。\n\n## 核心思路模型\n\n一个 SLM 以隐私、成本和离线操作为代价换取广度。成功的\n策略是：\u003Cstrong>让 SLM 进行协调，让工具承担繁重工作。\u003C\u002Fstrong>模型不需要\u003Cem>了解\u003C\u002Fem>代码库——只需知道何时调用\n`read_file` 和 `search_docs`。这发挥了 SLM 的优势（受限决策，\n如工具选择），避免其弱点（广泛知识、长链推理）。\n\n\n\n## 选择这些组件的原因\n\n- **Foundry Local** 暴露了一个\u003Cstrong>OpenAI 兼容的 HTTP 端点\u003C\u002Fstrong>，所以云端的代理代码只需更改 `base_url`（并使用本地占位 API 密钥）即可迁移。同时自动为机器选择最佳构建（CPU\u002FGPU\u002FNPU）。\n- **Qwen** 模型被训练为函数调用，可稳定产生格式良好的工具调用——这使得本地\u003Cem>聊天\u003C\u002Fem>模型转变为本地\u003Cem>代理\u003C\u002Fem>。\n- **Chroma** 在进程内运行并将向量存储在磁盘上，因此整个 RAG 流程（嵌入 → 存储 → 检索 → 推理）保持本地。\n- **MCP** 是一种传输协议，不是云服务：MCP 服务器可以在本地通过 `stdio` 运行。\n\n## 必备设置\n\n```bash\nfoundry model run qwen2.5-7b-instruct\nfoundry service status\n```\n\n```python\nfrom foundry_local import FoundryLocalManager\nfrom openai import OpenAI\n\nmanager = FoundryLocalManager(\"qwen2.5-7b-instruct\")\nclient = OpenAI(base_url=manager.endpoint, api_key=manager.api_key)  # 本地占位符\n```\n\n约 8 GB 内存是实际最低要求；有 GPU\u002FNPU 有助于性能但非必需。\n\n## 关键模式复现\n\n指引学习者使用笔记本\n[`17-local-agent-foundry-local.ipynb`](..\u002F..\u002F..\u002F17-creating-local-ai-agents\u002Fcode_samples\u002F17-local-agent-foundry-local.ipynb)：\n\n- \u003Cstrong>沙盒工具\u003C\u002Fstrong>：每个文件工具解析路径，并拒绝超出单一项目根目录的请求——即使本地，工具也以用户权限运行。\n- \u003Cstrong>工具调用循环\u003C\u002Fstrong>：用 OpenAI 工具 schema 注册工具，在本地执行请求的工具，反馈结果，循环直到给出最终答案。\n- **本地 RAG**：将文档 upsert 到 Chroma 集合；`search_docs` 返回 top-k 文档块。\n- **本地 MCP**：通过 `stdio` 连接本地服务器；以项目目录为作用域并验证其输出。\n\n## 混合路由（本地作为模型之一）\n\n| 情况 | 运行位置 |\n|-----------|---------------|\n| 敏感数据 \u002F 离线 | 本地 SLM |\n| 简单、受限任务 | 本地 SLM（廉价、快速） |\n| 复杂多跳推理处理非敏感数据 | 云端模型 |\n| 云服务中断 | 本地 SLM（渐进降级） |\n\n这与第16课中的模型路由思想相呼应，工作站作为其中一条路由。优先考虑优雅降级到本地的设计，使代理质量降低而非完全失败。\n\n\n\n## 助手的护栏\n\n- 将每个文件\u002F工具操作限定在沙盒项目目录内。\n- 当学习者明确目标为隐私\u002F离线时，不将代码或数据发送到云端——保持整个流程本地。\n- 对 SLM 质量设定合理预期；依赖工具和 RAG 而非模型记忆知识。\n- 注意第17课没有 Foundry Responses 端点，因此云端烟雾测试操作不适用——通过本地运行笔记本进行验证。\n\n---\n\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**免责声明**：\n本文件由 AI 翻译服务 [Co-op Translator](https:\u002F\u002Fgithub.com\u002FAzure\u002Fco-op-translator) 翻译完成。尽管我们力求准确，但请注意，自动翻译可能包含错误或不准确之处。原始语言版文件应视为权威来源。对于重要信息，建议使用专业人工翻译。我们对因使用本翻译而产生的任何误解或误释不承担责任。\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER END -->","# 使用 Foundry Local 和 Qwen 创建本地 AI 代理\n\n> 伴随 [第17课 – 创建本地 AI 代理](..\u002F..\u002F..\u002F17-creating-local-ai-agents\u002FREADME.md) 的附加技能。\n> 用它来帮助学习者构建一个能够推理、调用工具并且\n> 完全在他们自己的机器上搜索文档的代理——无云推理。所有\n> 建议均基于课程内容和可运行的笔记本。\n\n## 触发条件\n\n当学习者希望：\n- 由于隐私、成本或离线需求而\u003Cstrong>完全在设备上运行\u003C\u002Fstrong>代理时。\n- 使用 **Foundry Local** 在本地部署模型，并通过 OpenAI 兼容端点进行连接。\n- 使用 \u003Cstrong>Qwen 函数调用\u003C\u002Fstrong>模型来驱动可靠的本地工具调用时。\n- 添加 **本地 RAG**（Chroma）或 **本地 MCP 服务器**。\n- 设计一个\u003Cstrong>混合型\u003C\u002Fstrong>本地\u002F云路由策略。\n\n## 核心思路模型\n\n一个 SLM 以隐私、成本和离线操作为代价换取广度。成功的\n策略是：\u003Cstrong>让 SLM 进行协调，让工具承担繁重工作。\u003C\u002Fstrong>模型不需要\u003Cem>了解\u003C\u002Fem>代码库——只需知道何时调用\n`read_file` 和 `search_docs`。这发挥了 SLM 的优势（受限决策，\n如工具选择），避免其弱点（广泛知识、长链推理）。\n\n\n\n## 选择这些组件的原因\n\n- **Foundry Local** 暴露了一个\u003Cstrong>OpenAI 兼容的 HTTP 端点\u003C\u002Fstrong>，所以云端的代理代码只需更改 `base_url`（并使用本地占位 API 密钥）即可迁移。同时自动为机器选择最佳构建（CPU\u002FGPU\u002FNPU）。\n- **Qwen** 模型被训练为函数调用，可稳定产生格式良好的工具调用——这使得本地\u003Cem>聊天\u003C\u002Fem>模型转变为本地\u003Cem>代理\u003C\u002Fem>。\n- **Chroma** 在进程内运行并将向量存储在磁盘上，因此整个 RAG 流程（嵌入 → 存储 → 检索 → 推理）保持本地。\n- **MCP** 是一种传输协议，不是云服务：MCP 服务器可以在本地通过 `stdio` 运行。\n\n## 必备设置\n\n```bash\nfoundry model run qwen2.5-7b-instruct\nfoundry service status\n```\n\n```python\nfrom foundry_local import FoundryLocalManager\nfrom openai import OpenAI\n\nmanager = FoundryLocalManager(\"qwen2.5-7b-instruct\")\nclient = OpenAI(base_url=manager.endpoint, api_key=manager.api_key)  # 本地占位符\n```\n\n约 8 GB 内存是实际最低要求；有 GPU\u002FNPU 有助于性能但非必需。\n\n## 关键模式复现\n\n指引学习者使用笔记本\n[`17-local-agent-foundry-local.ipynb`](..\u002F..\u002F..\u002F17-creating-local-ai-agents\u002Fcode_samples\u002F17-local-agent-foundry-local.ipynb)：\n\n- \u003Cstrong>沙盒工具\u003C\u002Fstrong>：每个文件工具解析路径，并拒绝超出单一项目根目录的请求——即使本地，工具也以用户权限运行。\n- \u003Cstrong>工具调用循环\u003C\u002Fstrong>：用 OpenAI 工具 schema 注册工具，在本地执行请求的工具，反馈结果，循环直到给出最终答案。\n- **本地 RAG**：将文档 upsert 到 Chroma 集合；`search_docs` 返回 top-k 文档块。\n- **本地 MCP**：通过 `stdio` 连接本地服务器；以项目目录为作用域并验证其输出。\n\n## 混合路由（本地作为模型之一）\n\n| 情况 | 运行位置 |\n|-----------|---------------|\n| 敏感数据 \u002F 离线 | 本地 SLM |\n| 简单、受限任务 | 本地 SLM（廉价、快速） |\n| 复杂多跳推理处理非敏感数据 | 云端模型 |\n| 云服务中断 | 本地 SLM（渐进降级） |\n\n这与第16课中的模型路由思想相呼应，工作站作为其中一条路由。优先考虑优雅降级到本地的设计，使代理质量降低而非完全失败。\n\n\n\n## 助手的护栏\n\n- 将每个文件\u002F工具操作限定在沙盒项目目录内。\n- 当学习者明确目标为隐私\u002F离线时，不将代码或数据发送到云端——保持整个流程本地。\n- 对 SLM 质量设定合理预期；依赖工具和 RAG 而非模型记忆知识。\n- 注意第17课没有 Foundry Responses 端点，因此云端烟雾测试操作不适用——通过本地运行笔记本进行验证。\n\n---\n\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**免责声明**：\n本文件由 AI 翻译服务 [Co-op Translator](https:\u002F\u002Fgithub.com\u002FAzure\u002Fco-op-translator) 翻译完成。尽管我们力求准确，但请注意，自动翻译可能包含错误或不准确之处。原始语言版文件应视为权威来源。对于重要信息，建议使用专业人工翻译。我们对因使用本翻译而产生的任何误解或误释不承担责任。\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER END -->",{"name":5,"license":14},"main","f09e94ffe170f8af6d3db7c42987bbe4db227723","translations\u002Fzh-CN\u002F.agents\u002Fskills\u002Flocal-ai-agents",26057,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners","https:\u002F\u002Faka.ms\u002Fai-agents-beginners","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-07 12:51:12",{"source":7,"skillName":5,"commands":36,"prompt":46,"zipAvailable":47},[37,40,43],{"tool":38,"command":39},"npx","npx skills add microsoft\u002Fai-agents-for-beginners --skill local-ai-agents",{"tool":41,"command":42},"bunx","bunx skills add microsoft\u002Fai-agents-for-beginners --skill local-ai-agents",{"tool":44,"command":45},"pnpm","pnpm dlx skills add microsoft\u002Fai-agents-for-beginners --skill local-ai-agents","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fzh-CN\u002F.agents\u002Fskills\u002Flocal-ai-agents\u002FSKILL.md",true,[],[50,68,79,84,92,99],{"skillNo":51,"name":52,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":53,"categories":54,"keywords":65,"publishedAt":20},"01M69A206TRZ8KK0CW0HYJF5V5","testing-course-samples","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fzh-TW\u002F.agents\u002Fskills\u002Ftesting-course-samples\u002FSKILL.md",[55,60],{"categoryNo":56,"categoryName":57,"taxonomyType":58,"taxonomyTypeDesc":59},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":61,"categoryName":62,"taxonomyType":63,"taxonomyTypeDesc":64},"01JBSEEDCAT000000000000039","教师与教育","PROFESSION","适用职业",[66,67],"testing","testing course samples",{"skillNo":69,"name":70,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":76,"publishedAt":20},"01M69A1XRB2SFHYRMEH0K08EKZ","microsoft-docs","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fzh-TW\u002F.agents\u002Fskills\u002Fmicrosoft-docs\u002FSKILL.md",[73],{"categoryNo":74,"categoryName":75,"taxonomyType":58,"taxonomyTypeDesc":59},"01JBSEEDCAT000000000000023","Skill与智能体开发",[77,8,78],"docs","microsoft docs",{"skillNo":80,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":20},"01M69A1VPZFJQ1HNGTZQ5P3WSC","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fzh-TW\u002F.agents\u002Fskills\u002Flocal-ai-agents\u002FSKILL.md",[],[18,19],{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":20},"01M69A1S947N7MM6V9JF85S2E7","jupyter-notebook","當使用者要求建立、搭建或編輯 Jupyter 筆記本（`.ipynb`）用於實驗、探索或教學時使用；優先使用隨附範本並執行輔助腳本 `new_notebook.py` 來產生一個乾淨的起始筆記本。","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fzh-TW\u002F.agents\u002Fskills\u002Fjupyter-notebook\u002FSKILL.md",[],[91],"jupyter notebook",{"skillNo":93,"name":94,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":20},"01M69A1Q8EXPWKZSQK69V6WF22","deploying-scalable-agents","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fzh-TW\u002F.agents\u002Fskills\u002Fdeploying-scalable-agents\u002FSKILL.md",[],[98],"deploying scalable agents",{"skillNo":100,"name":101,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":20},"01M69A1MHZTH3RH9N8VYSYG74X","azure-openai-to-responses","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fzh-TW\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002FSKILL.md",[],[105],"azure openai to responses"]