实用提示:无需支付API费用:构建本地多智能体AI系统的方法
《实用笔记》操作指南:无需 API 费用——利用合同、校验机制以及可直接插入的代码模块,为采用该模式的团队构建本地多智能体 AI 系统。
可将此内容视为《无需 API 费用:利用 Gemma 4、Ollama 和 Google ADK 构建本地多智能体 AI 系统》一文中理念的面向操作员的详细版本:包含清晰的阶段划分、有序的代码模块以及便于交接时参考的恢复说明。 将“概览”阶段视为可量化的基准最为有效。在扩大范围之前,先记录一份最佳示例、一个故障案例以及对应的回滚说明。 在功能结果旁同时记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外账单。
我们正在构建什么
在“我们正在构建什么”阶段,应在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 配置信息应置于应用程序代码之外。环境文件、密钥存储以及功能标志应集中存放于一个位置,这样操作员无需查看整个系统结构即可进行审核。 将客户端构建与消息处理循环分开,这样即便更换提供方,也无需重写对话状态机。
为何选择 Gemma 4 E4B?
对于 Why Gemma 4 E4B 阶段,在修改代码之前需明确输入参数、该步骤的负责人以及退出标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 需同时记录正常流程和异常恢复流程。重试机制、人工审核环节以及错误消息处理都是产品本身的组成部分,而非后续需要补充的功能。 应将客户端构建逻辑与消息循环分离,这样在更换提供方时无需重写对话状态机。
gemma4:e4b
gemma4:e2b
使用的硬件
在“使用的硬件”阶段,修改代码之前需明确输入参数、该步骤的负责人以及退出标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 优先选择小型、可测试的单元,而非冗长的脚本。当某个步骤失败时,故障应指向单一责任方,而非复杂的流程链。 将客户端构建与消息循环分开,这样就可以在不重写对话状态机的情况下更换提供方。 在“使用的硬件”阶段,修改代码之前需明确输入参数、该步骤的负责人以及退出标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 在功能结果之外,还需记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。
步骤1:安装Ollama
在执行“安装Ollama”这一步骤时,首先需明确相关要求:所需输入、成功标志以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改不会出错。 配置信息应与应用程序代码分开存放。环境文件、密钥存储以及功能开关应集中管理,这样操作人员无需查看整个系统结构即可进行审核。 每次调用时都要记录请求ID、模型ID以及延迟时间。如果没有这些记录,间歇性的服务错误就会被误认为是应用程序的故障。
brew install ollama
brew update
brew upgrade ollama
ollama --version
步骤2:下载Gemma 4
在执行第二步“下载Gemma”阶段时,首先需记录下相关契约:所需的输入参数、成功信号以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改不会偏离原有设计。
ollama pull gemma4:e4b
ollama list
NAME ID SIZE
gemma4:e4b ... 9.6 GB
第三步:直接测试Gemma
在完成 Step 3 Test Gemma 阶段时,首先需明确接口规范:所需的输入参数、成功标识以及部分失败时的处理方式。这份清单能确保后续的代码修改保持一致性。 建议采用小型、可测试的单元而非庞大的脚本。当某个步骤失败时,故障应指向单一责任模块,而非复杂的处理流程。 每次调用时都要记录请求 ID、模型 ID 以及延迟时间。如果没有这些记录,间歇性的服务错误就会被视为应用程序的缺陷。 在完成 Step 3 Test Gemma 阶段时,首先需明确接口规范:所需的输入参数、成功标识以及部分失败时的处理方式。这份清单能确保后续的代码修改保持一致性。 在功能结果旁还需记录执行时间以及代币或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外的费用支出。
ollama run gemma4:e4b
Create an outline for an article explaining AI agents to beginners.
/bye
第4步:检查Ollama是否已在运行
将第4步的“检查功能是否正常”视为可测量的指标会更为有效。在扩大测试范围之前,先记录一个成功的示例、一个失败的案例以及回滚说明。 配置信息应置于应用程序代码之外。环境文件、密钥存储和功能开关应集中存放,以便操作人员无需查看整个系统结构即可进行审计。 在设置循环逻辑之前,先锁定解释器和依赖项的版本。笔记本电脑与持续集成环境之间的差异是API演示中最常见的隐性故障原因。
http://127.0.0.1:11434
ollama serve
Error: listen tcp 127.0.0.1:11434: bind: address already in use
curl http://127.0.0.1:11434/api/tags
ollama ps
第5步:创建ADK项目
在将第5步“创建测试环境”视为可度量的工作面时,其效果最佳。在扩大范围之前,先记录一个成功的测试用例、一个失败案例以及回滚说明。同时记录正常流程和恢复流程的文档。重试机制、人工审核环节以及错误处理都是产品本身的一部分,而非后续需要补充的内容。在讲解循环逻辑之前,先锁定解释器和依赖项的文件。笔记本电脑与持续集成环境之间的差异是API演示中最常见的隐性故障原因。
cd /Users/yourusername
mkdir bloggeragent
cd bloggeragent
touch requirements.txt .env .gitignore __init__.py agent.py
bloggeragent/
├── .env
├── .gitignore
├── __init__.py
├── agent.py
└── requirements.txt
第6步:创建虚拟环境
第6步“创建阶段”若被视为可度量的对象,效果会更好。在扩大范围之前,需记录一份理想的执行日志、一个故障案例以及回滚说明。 相比庞大的脚本,应优先使用小型且可测试的单元。当某一步骤出现故障时,故障原因应能指向单一责任模块,而非复杂的流程链。 在讲解循环逻辑之前,需先固定解释器及依赖项的锁定文件。在笔记本电脑与持续集成环境之间的差异是API演示中最常见的隐性故障来源。 第6步“创建阶段”若被视为可度量的对象,效果会更好。在扩大范围之前,需记录一份理想的执行日志、一个故障案例以及回滚说明。 除了功能结果外,还需记录执行时间以及令牌或查询的成本。尽早了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。
python3 -m venv .venv
source .venv/bin/activate
(.venv)
which python
/Users/philipobiorah/bloggeragent/.venv/bin/python
第7步:安装支持本地模型的Google ADK
在“安装Google”的第7步中,应在修改代码之前明确输入参数、该步骤的负责人以及完成标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 配置信息应置于应用程序代码之外。环境文件、密钥存储和功能标志应集中存放,以便操作人员无需查看整个系统结构即可进行审核。 将客户端构建与消息处理循环分开,这样在更换提供方时无需重写对话状态机。
google-adk[extensions]==2.2.0
python-dotenv
litellm>=1.84
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
ImportError: LiteLLM support requires:
pip install google-adk[extensions]
python -m pip install --upgrade "google-adk[extensions]==2.2.0"
python -m pip install --upgrade "litellm>=1.84"
python -c "from google.adk.models.lite_llm import LiteLlm; print('LiteLLM connection ready')"
LiteLLM connection ready
第8步:配置本地Ollama连接
在第八步“配置阶段”中,应在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 需同时记录正常流程和异常恢复流程。重试机制、人工审核环节以及错误消息处理都是产品本身的组成部分,而非后续需要补充的功能。 应将客户端构建部分与消息循环分离,这样在更换服务提供商时无需重写对话状态机。
OLLAMA_API_BASE=http://127.0.0.1:11434
GOOGLE_API_KEY
.env
.venv/
__pycache__/
*.pyc
第九步:配置 Python 包
在“第9步:配置阶段”中,应在修改代码之前明确输入参数、该步骤的负责人以及终止条件。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 优先选择小型、可测试的单元,而非庞大的脚本。当某个步骤失败时,故障应指向单一的责任主体,而非复杂的流程链。 将客户端构建与消息循环分开,这样就可以在不重写对话状态机的情况下更换提供者。 在“第9步:配置阶段”中,应在修改代码之前明确输入参数、该步骤的负责人以及终止条件。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 除了功能结果外,还需记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。
from . import agent
第10步:定义本地Gemma模型
在执行“定义阶段”的第10步时,首先需写下相关契约:所需输入、成功信号以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。 将配置信息置于应用程序代码之外。环境文件、密钥存储以及功能开关应集中存放于一个位置,以便操作人员无需查看整个系统结构即可进行审计。 每次调用时都要记录请求ID、模型ID以及延迟时间。如果没有这些记录,间歇性的服务错误就会被视为应用程序的缺陷。
import datetime
from dotenv import load_dotenv
from google.adk.agents import Agent, LoopAgent
from google.adk.models.lite_llm import LiteLlm
from google.adk.tools import agent_tool
load_dotenv()
MODEL = LiteLlm(
model="ollama_chat/gemma4:e4b"
)
MODEL = LiteLlm(
model="ollama_chat/gemma4:e2b"
)
第11步:构建多智能体工作流
在执行第11步“构建阶段”时,首先写下相关契约:所需的输入参数、成功信号以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。 同时记录正常流程和异常恢复流程。重试机制、人工审核环节以及错误消息处理都是产品本身的组成部分,而非后续需要补充的功能。 每次调用时都要记录请求ID、模型ID以及延迟时间。如果没有这些记录,间歇性的服务端错误就会被视为应用程序的缺陷。
配置 __init__.py
在处理“Configure init py”阶段时,首先需明确相关规范:所需的输入参数、成功信号以及部分失败时的处理方式。这份清单能确保后续的代码修改始终符合预期。 建议采用小型、可测试的单元而非冗长的脚本。当某个步骤出现故障时,故障应指向单一责任模块,而非复杂的流程链。 每次调用时都要记录请求ID、模型ID以及延迟时间。如果没有这些记录,间歇性的服务错误就会被视为应用程序的缺陷。 在处理“Configure init py”阶段时,首先需明确相关规范:所需的输入参数、成功信号以及部分失败时的处理方式。这份清单能确保后续的代码修改始终符合预期。 在功能结果之外,还需记录执行时间以及代币或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外的费用支出。
from . import agent
修改本地 Gemma 的导入设置
将“修改阶段导入设置”视为可度量的工作面最为有效。在扩大范围之前,先记录一份成功的测试案例、一个失败案例以及回滚说明。 配置应置于应用程序代码之外。环境文件、密钥存储和功能标志应集中存放,以便操作人员无需查看整个系统结构即可进行审计。 在讲解循环逻辑之前,先锁定解释器和依赖项的版本。笔记本电脑与持续集成环境之间的差异是 API 演示中最常见的隐性故障原因。
from google.adk.models.lite_llm import LiteLlm
import sys
from pathlib import Path
import datetime
from dotenv import load_dotenv
from google.adk.agents import Agent, LoopAgent
from google.adk.tools import agent_tool
替换托管的 Gemini 模型
将托管的 Gemini 阶段视为可度量的对象来处理,其替换功能才能发挥最佳效果。在扩大范围之前,先记录一个成功的案例、一个失败案例以及回滚说明。同时文档化正常流程与恢复流程。重试机制、人工审核环节以及错误处理都是产品本身的一部分,而非后续需要补充的内容。在编写循环逻辑之前,先锁定解释器及依赖项的锁文件。笔记本电脑与持续集成环境之间的差异是 API 演示中最常见的隐性故障原因。
MODEL = os.getenv("MODEL", "gemini-flash-latest")
MODEL = LiteLlm(
model="ollama_chat/gemma4:e4b"
)
import datetime
from dotenv import load_dotenv
from google.adk.agents import Agent, LoopAgent
from google.adk.models.lite_llm import LiteLlm
from google.adk.tools import agent_toolload_dotenv()MODEL = LiteLlm(
model="ollama_chat/gemma4:e4b"
)
model=MODEL
该项目所体现的内容
“本项目展示了什么”这一阶段若被视为可度量的对象会更为有效。在扩大范围之前,先记录一份理想的运行日志、一个故障案例以及回滚说明。 相较于庞大的脚本,应优先选择小型且可测试的单元。当某一步骤出现故障时,故障应指向单一责任模块,而非复杂的流程链。 在讲解循环逻辑之前,先确定解释器版本及依赖项锁定文件。笔记本电脑与持续集成环境之间的差异是API演示中最常见的隐性故障来源。 “本项目展示了什么”这一阶段若被视为可度量的对象会更为有效。在扩大范围之前,先记录一份理想的运行日志、一个故障案例以及回滚说明。 除了功能结果外,还需记录执行时间以及令牌或查询成本。尽早了解这些成本信息,可避免在从演示环境过渡到共享环境时出现意外费用。
完整项目实现
在完整项目实施阶段,应在修改代码之前明确输入参数、各步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 配置信息应置于应用程序代码之外。环境文件、密钥存储以及功能标志应集中存放于一个位置,以便操作人员无需查看整个系统结构即可进行审计。 应将客户端构建与消息处理循环分开,这样在更换提供方时无需重写对话状态机。
git clone https://github.com/philipobiorah/bloggeragent.git
cd bloggeragent
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
结论
在结论阶段,应在修改代码之前明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 需同时记录正常流程和异常恢复流程。重试机制、人工审核环节以及死信处理都是产品本身的组成部分,而非后续需要补充的功能。 应将客户端构建部分与消息循环分离,这样即便更换提供方,也无需重写对话状态机。
参考资料
在参考阶段,修改代码之前需明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 优先选择小型、可测试的单元,而非庞大的脚本。当某个步骤失败时,故障应指向单一责任模块,而非复杂的流程链。 将客户端构建部分与消息处理循环分开,这样就可以在不重写对话状态机的情况下更换提供方。 在参考阶段,修改代码之前需明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 在功能结果之外,还需记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。
操作检查清单
在处理操作检查清单阶段时,首先写下合同条款:所需的输入参数、成功标志以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。
将此阶段视为输入与验证后输出之间的契约。为相关成果命名,明确成功判定标准,杜绝默许的部分完成情况。
每次调用时都要记录请求编号、模型编号以及延迟时间。没有这些记录,间歇性的服务端错误就会被误认为是应用程序的故障。
保持图结构的扁平化与类型化。嵌套的数据结构会掩盖哪个节点修改了哪个字段,还会导致中断后无法继续执行。
只要预算允许,就应在持续集成过程中使用测试环境而非真实的付费 API 来添加能够检测关键路径的冒烟测试。
请同时记录正常流程和故障恢复流程。重试机制、人工审核环节以及死信处理都是产品不可或缺的部分,而非后续需要补充的功能。
在推广该技术栈之前,应先冻结版本,为关键流程保存完整的操作记录,并明确回滚步骤。共享环境需要设置速率限制、进行租户身份验证,同时指定专人负责密钥轮换工作。与其展示花哨的一次性演示,不如追求扎实可靠的性能。
关于 4ecfd0db9610 的批量处理说明:请勿将提供商密钥放入代码仓库,应为每个会话设置令牌使用上限,并将操作记录与评估用配置文件存放在同一位置,以便后续更换模型时仍能保持数据可比性。