1. 项目概述:打造个性化AI助手mAIdAI

作为一名长期从事AI系统设计的架构师,我每天的工作就是为各种企业设计智能代理和自动化流程。但讽刺的是,我自己的日常工作却充满了重复性劳动——不断回答相同的问题、反复查找相同的文档链接、在不同任务间频繁切换上下文。这种"鞋匠的孩子没鞋穿"的现状促使我开发了mAIdAI(My AI Aid),一个基于Google Cloud和Vertex AI的个性化助手系统。

这个项目的核心价值在于解决了通用AI助手的三大痛点:

  1. 上下文缺失 :通用助手不了解我的专业领域、工作习惯和个人知识库
  2. 交互低效 :简单查询也需要完整的LLM推理流程,造成不必要的延迟和成本
  3. 隐私顾虑 :敏感的工作讨论不希望经过第三方AI服务

mAIdAI的特别之处在于它完全构建在我的Google生态内,通过以下方式实现真正的个性化:

  • 使用 context.md 作为"第二大脑",持续积累我的专业知识和工作上下文
  • 设计了三层智能交互体系,根据任务复杂度自动选择最优处理路径
  • 所有数据处理都限制在我的Google Cloud项目内,确保商业机密安全

2. 系统架构设计解析

2.1 整体架构方案

mAIdAI采用了事件驱动的无服务器架构,这是经过多方面权衡后的最优选择:

前端层

  • 直接复用Google Chat界面,零前端开发成本
  • 利用现有身份认证体系,无需额外登录管理
  • 符合日常使用习惯,避免工具切换带来的效率损耗

传输层

  • 基于HTTP Webhook实现事件推送
  • 采用Google标准的认证机制(IAM)
  • 自动处理重试和错误恢复机制

后端层

  • Cloud Run托管FastAPI应用,主要考虑因素:
    • 自动扩缩容能力应对突发流量
    • 按实际使用量计费的经济模型
    • 极简的运维负担(连SSH都不需要)
  • 单实例设计保证状态一致性:
    • 启动时加载最新 context.md
    • 运行时维护对话历史上下文

智能层

  • Vertex AI Gemini模型提供核心推理能力
  • 模型选择策略:
    • 常规对话使用 gemini-1.5-flash 平衡速度与质量
    • 复杂任务切换 gemini-1.5-pro 获取更强能力
  • 系统指令注入技术:
    config = types.GenerateContentConfig(
        system_instruction=MODEL_CONTEXT,  # 从context.md加载
        max_output_tokens=5000,
    )
    

2.2 关键设计决策

为什么选择Cloud Run而非Cloud Functions?

  • 需要长时间运行的Web服务特性
  • 更灵活的资源配置(CPU/Memory)
  • 本地文件系统访问需求(读取context.md)
  • 更长的请求超时时间(60分钟)

异步处理模式的选择

@app.post("/")
async def index(request: Request) -> dict:
    event = await request.json()
    # 使用async/await处理并发请求
    return await process_event(event)

这种设计使得单个Cloud Run实例可以同时处理多个请求,显著提高资源利用率。

3. 核心功能实现细节

3.1 三层交互体系

快速命令(Quick Commands)

  • 实现原理:内存中的键值对映射
  • 典型应用场景:
    • 常用文档链接(设计规范、API文档)
    • 代码片段速查(gcloud命令模板)
    • 联系人信息(团队成员的Slack ID)
  • 性能优势:响应时间<100ms,零LLM调用成本

斜杠命令(Slash Commands)

  • 技术实现:
    if command_type == "SLASH_COMMAND":
        prompt = f"{command_text}. USER INPUT: {user_input}"
        return await chat(prompt)
    
  • 实用案例:
    • /fix :自动调试代码片段
    • /rewrite :邮件/文档润色
    • /summarize :会议纪要浓缩

上下文聊天(Context-Aware Chat)

  • 上下文维护机制:
    • 对话历史保留最近20轮
    • 自动注入系统指令
    • 动态引用相关文档片段
  • 隐私保护设计:
    • 所有数据仅存储在项目内的Firestore
    • 7天后自动清除历史记录

3.2 知识管理系统

context.md的编写规范

# 个人知识库 - Médéric Hurier

## 常用资源
- 项目文档:...[链接]...
- 代码规范:...[Markdown格式]...

## 工作流程
1. 代码审查流程:...[详细步骤]...
2. 部署检查清单:...[项目列表]...

## 个人偏好
- 邮件风格:简洁、使用项目符号
- 会议原则:必须有明确议程

这种结构化的知识表示让LLM能更准确地理解和使用个人信息。

知识更新机制

  • 每日自动备份到Cloud Storage
  • Git版本控制跟踪重要变更
  • 通过特殊命令 /learn 实时添加新知识

4. 部署与优化实践

4.1 基础设施配置

Cloud Run部署要点

gcloud run deploy maidai \
  --source . \
  --region us-central1 \
  --set-env-vars=GOOGLE_CLOUD_PROJECT=my-project \
  --allow-unauthenticated

关键参数说明:

  • --concurrency :设置为50平衡性能与成本
  • --cpu :使用1个vCPU保证响应速度
  • --memory :配置2GiB应对大上下文场景

安全配置最佳实践

  1. 最小权限原则:仅分配必要的Vertex AI调用权限
  2. 请求验证:
    from google.auth.transport import requests
    from google.oauth2 import id_token
    
    def verify_request(request):
        token = request.headers.get("Authorization")
        return id_token.verify_token(token, requests.Request())
    
  3. 网络隔离:启用VPC Service Controls

4.2 性能优化技巧

冷启动缓解方案

  • 设置最小实例数为1
  • 使用健康检查端点保持活跃
  • 精简依赖项(删除不必要的库)

LLM调用优化

async def chat(prompt: str) -> str:
    model = client.get_model("gemini-1.5-flash")
    response = await model.generate_content_async(
        prompt,
        generation_config=config,
    )
    return response.text

关键优化点:

  • 异步调用避免阻塞
  • 流式传输减少感知延迟
  • 模型选择策略动态调整

5. 实战问题排查指南

5.1 常见错误与解决方案

Webhook验证失败

  • 症状:Google Chat消息无法送达
  • 检查清单:
    1. IAM角色是否正确配置
    2. 服务账号是否具有 run.invoker 权限
    3. 端点URL是否包含正确的路径

上下文丢失问题

  • 现象:对话中忘记之前讨论的内容
  • 解决方法:
    • 增加对话历史存储轮次
    • context.md 中添加相关提示
    • 调整系统指令权重参数

模型响应不稳定

  • 调试步骤:
    1. 检查 context.md 格式是否规范
    2. 验证temperature参数设置(建议0.3-0.7)
    3. 添加输出格式约束指令

5.2 成本控制策略

Vertex AI成本监控

  • 设置预算提醒:
    gcloud alpha billing budgets create \
      --display-name="VertexAI Monthly" \
      --budget-amount=100 \
      --threshold-rule=percent=0.5 \
      --filter='service:"aiplatform.googleapis.com"'
    

优化技巧

  • 为简单命令设置缓存(Cloud Memorystore)
  • 使用 gemini-1.5-flash 处理80%的常规请求
  • 实现自动降级机制(当QPS过高时)

6. 扩展与定制建议

经过三个月的日常使用,mAIdAI已经成为我工作中不可或缺的伙伴。一些出乎意料的使用场景包括:

  • 会议纪要自动生成(通过Gmail集成)
  • 代码审查意见自动草拟(GitHub API连接)
  • 知识库的自动整理(定期总结聊天记录)

对于想要构建类似系统的开发者,我的实践建议是:

  1. 从最小的可用版本开始(甚至可以先只有Quick Commands)
  2. 逐步积累 context.md 内容,不要试图一次性完善
  3. 建立定期反馈机制(我用 /feedback 命令收集使用体验)

这个项目的全部代码已在GitHub开源,包含详细的部署指南和使用案例。最让我自豪的不是技术实现,而是它真正改变了我的工作方式——现在我可以更专注在创造性的架构设计上,而把那些重复性的认知劳动交给我的数字分身来处理。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐