文章摘要
作者是一家老年和残障服务SaaS公司的技术总监,公司拥有一个7年历史的Ruby on Rails单体应用。虽然系统数据量大且敏感,但AI代理开发尚未成为重点。在参加SF Ruby会议后,作者发现大多数AI应用案例与自身系统特点(严格数据边界、复杂访问规则)存在差异。
文章总结
标题:在七年历史的Rails单体应用中构建AI智能体
核心内容: 1. 项目背景 - 作者担任工程总监的Mon Ami公司开发面向老年及残障案例工作者的SaaS解决方案 - 基于Ruby on Rails构建的七年历史单体应用,具有严格的多租户数据安全要求 - 现有系统通过Algolia索引优化客户记录查询性能
- 技术突破契机
- 在SF Ruby技术会议上受启发,发现RubyLLM gem可实现受限数据访问的RAG系统
- 关键创新:通过函数调用封装复杂权限逻辑(Pundit策略),避免直接开放数据库访问
- 技术实现方案
- 采用RubyLLM gem构建对话系统:
- 配置多LLM提供商API(OpenAI/Anthropic)
- 定义工具类实现Algolia搜索与权限校验的融合
- 示例工具类包含参数描述、执行方法和返回结构
- 前端通过Turbo Streams实现实时对话界面
- 后台使用Active Job异步处理消息
- 模型选择经验
- GPT-5:上下文容量大但响应延迟明显
- GPT-4:易产生幻觉回答
- GPT-4o:在速度与准确性间取得最佳平衡
- 开发总结
- 耗时2-3天完成开发(借助Claude辅助)
- 核心复杂度在于构建工具服务对象(类似API控制器)
- 对比ActiveAgent等方案后选择RubyLLM因其工具定义和长对话支持
删减内容: - 原文中关于会议其他演讲的泛泛描述 - 初始配置代码中的注释细节 - 前端模板语言的具体语法标记 - 与其他技术方案对比的次要细节
保留要点: - 在严格权限约束环境下实现AI智能体的创新方法 - 关键技术决策背后的具体考量 - 可复用的工程实践模式(权限封装、异步处理等)
评论总结
评论总结:
- 对LLM数据访问的担忧
- pell质疑LLM直接访问返回数据的安全性,建议限制其仅查看状态信息而非完整输出 "Was there any concern about giving the LLM access to this return data?" "only seeing the start of a JSON string with a status like 'success' or 'not found'"
- 对项目实用性的质疑
- tovej认为直接使用API比通过LLM更高效 "why not just let the users directly interact with the API? The LLM is just extra bloat"
- midnightclubbed质疑AI聊天功能的必要性 "they can just use it to do searches of client information... which the existing site would already do"
- 技术方案讨论
- vicentereig详细讨论了DSPy.rb的分层架构优势 "Total tokens stay similar, but signal density per prompt goes up" "DSPy.rb enables this pattern in Ruby: define typed Signatures for each concern"
- Lio对比RubyLLM和DSPy.rb的使用体验 "I'm trying to contrast that with my own use of DSPy.rb"
- 对AI热潮的反思
- shevy-java批评当前对AI的过度追捧 "I find the addiction to AI annoying" "there are also numerous bad examples of AI use"
- 代码质量赞赏
- marklwatson赞扬Ruby代码的设计风格 "I liked how well designed the monolith application seems to be" "it seems like in general many Ruby devs have excellent style"
- 历史类比
- Herring将该项目比作2010年代失败的"自然语言转SQL"趋势 "which largely failed because business users required 100% accuracy"
- 其他
- sidd22表达合作兴趣 "Would you be open for a quick chat?"
- rahimnathwani指出文章模型列表过时 "None of these are current generation models"