LLMs的GraphQL与REST:比较
该项目展示了GraphQL和REST API在与大型语言模型(LLM)一起使用时的差异,特别是Anthropic的Claude。它展示了GraphQL如何减少令牌的使用以及分层数据查询的API往返。
🎯 项目概述
此演示包括:
- 单一Elysia服务器 同时为REST和GraphQL端点提供服务
- 模拟数据 (用户、帖子、评论)没有数据库
- 两个AI代理:
- REST代理:通过工具调用使用多个REST端点 - GraphQL代理:使用单个GraphQL端点和嵌套查询
- 比较脚本:运行代理并测量令牌使用情况、API调用和效率
📁 项目结构
src/
├── data/
│ └── mock-data.ts # Shared mock data
├── rest/
│ └── handlers.ts # REST endpoint handlers
├── graphql/
│ └── schema.ts # GraphQL schema and resolvers
├── agents/
│ ├── rest-agent.ts # Agent using REST API
│ ├── graphql-agent.ts # Agent using GraphQL API
│ └── comparison.ts # Comparison script
└── index.ts # Main server file🚀 入门指南
先决条件
- 包子 运行时已安装
- 无烟煤API密钥(在https://console.anthropic.com/)
安装
- 安装依赖项:
bun install- 通过创建
.env.local文件:
echo "ANTHROPIC_API_KEY=your_api_key_here" > .env.local或手动创建 .env.local:
ANTHROPIC_API_KEY=your_api_key_here注: .env.local 为了安全起见,该文件被标记为无效。
🏃 运行项目
启动服务器
bun run dev
# or
bun run start服务器将于启动http://localhost:3000与:
- GraphQL端点:http://localhost:3000/graphql
- REST端点:http://localhost:3000/rest/\*
运行比较
在单独的终端中(服务器正在运行):
bun run compare这将使两个代理运行几个测试场景,并显示详细的指标比较:
- 令牌使用情况(输入、输出、总计)
- API调用数
- 提高效率
📊 API终点
GraphQL端点
网址: http://localhost:3000/graphql
示例查询:
query {
user(id: "1") {
name
email
posts {
title
likes
comments {
content
author {
name
}
}
}
}
}REST端点
GET /rest/users/:id-按ID获取用户GET /rest/users/:id/posts-获取用户的帖子GET /rest/posts/:id-按ID获取帖子GET /rest/posts/:id/author-获取文章作者GET /rest/posts/:id/comments-获取帖子评论GET /rest/comments/:id-按ID获取评论GET /rest/comments/:id/author-获取评论的作者POST /rest/comments-创建新评论
💡 关键见解
当GraphQL闪耀时
- 分层数据查询:获取嵌套关系(例如,用户→ 帖子→ 评论→ 作者)
- 减少往返次数:单个查询而不是多个REST调用
- 代币效率:由于工具调用和响应减少,令牌使用量减少
- 灵活的数据获取:确切地要求你需要什么
何时REST可能足够
- 简单、扁平的数据查询
- 单资源查找
- 非分层操作
LLM的具体考虑因素
- 架构描述GraphQL的类型系统及其描述有助于LLM理解可用的操作
- 工具调用效率:与许多特定工具相比,具有灵活参数的工具更少
- 成本优化:代币节约转化为LLM API的成本节约
- 延迟:更少的往返意味着更快的响应时间
🧪 测试场景
比较脚本包括三个测试场景:
- 简单用户查询:基本单一资源查找
- 分层数据查询:多级嵌套数据
- 深度嵌套查询:具有多个连接的复杂关系
每个场景都通过REST和GraphQL代理运行,以展示方法和效率的差异。
🛠️ 使用的技术
- 包子 -JavaScript运行时
- 伊莉西娅 -Web框架
- GraphQL瑜伽 -GraphQL服务器
- 人物克劳德 -法学硕士(克劳德·十四行诗4)
- TypeScript -类型安全
📝 演示说明
- 这是一个用于教育目的的演示
- 使用模拟数据(没有真实数据库)
- 关注代币效率和API设计模式
- 展示LLM工具调用策略的实际差异
📄 许可证
这是一个演示项目,用于演示目的。
