RΞASON框架适合构建LLM应用吗?它的TypeScript结构化输出好用吗?
AIAI Summary (BLUF)
RΞASON是一个开源TypeScript后端框架,专为构建LLM应用而设计。其核心特性包括:基于TypeScript接口的结构化输出、函数式代理、原生流式支持以及零配置可观测性。
引言:LLM 作为一种新的编程原语
我将大型语言模型(LLMs)视为一种变革性的编程原语,其重要性堪比 20 世纪 70 年代的数据库或 21 世纪初的 Web 技术爆炸。它们为开发者提供了一种独特的能力:将推理和自然语言理解直接融入代码的能力。
然而,新的原语需要新的抽象。RΞASON 的目标正是提供这样一个强大、直观的抽象层,将 LLM 无缝集成到现代开发者的工作流中。
什么是 RΞASON?
RΞASON 是一个开源的 TypeScript 后端框架,专为构建生产级 LLM 应用而设计。其核心理念是利用熟悉的编程概念,而不是强迫开发者学习全新的范式。
其最显著的特点之一是使用 TypeScript 的 interface 定义来从 LLM 获取结构化、类型安全的输出,从而消除了对复杂且脆弱的文本解析的需求。
快速开始
要开始使用 RΞASON,请使用以下命令安装:
npx use-reason@latest
接下来,创建一个简单的 API 端点。例如,在 src/entrypoints/joke.ts 创建一个文件:
import { reasonStream } from 'tryreason'
interface Joke {
joke: string;
topics: string[]
}
export async function* GET() {
return reasonStream<Joke>('tell me a joke')
}
最后,运行开发服务器:
npm run dev
本文将深入探讨 RΞASON 的核心功能和设计理念。如需完整的教程,请参阅官方的 RΞASON 文档。
设计背景与核心理念
虽然 LLM 代表了一种新的原语,但它们不应要求彻底改变现有的编程范式。关键在于将它们适配到我们当前的工作流中。RΞASON 基于五个基本原则来实现这种集成。
结构化输出至关重要,但不应以牺牲开发体验为代价
LLM 的基本输入和输出是非结构化的文本。虽然这对人机交互很理想,但对程序化使用却带来了重大挑战:
- 字符串解析困难: 从自然语言中提取结构化数据需要复杂且容易出错的解析逻辑。
- 难以维护: 解析逻辑必须频繁更新,以处理 LLM 输出的多变性和细微差别。
许多框架解决了结构化输出的问题,但引入了新的、专有的 API。RΞASON 采用了一种不同的方法,利用熟悉的 TypeScript interface 和 JSDoc 注释。
import { reason } from 'tryreason'
interface Joke {
/** Use this property to indicate the age rating of the joke */
rating: number;
joke: string;
/** Use this property to explain the joke to those who did not understand it */
explanation: string;
}
const joke = await reason<Joke>('tell me a really spicy joke')
reason() 函数直接查询 LLM 并返回一个完全类型化的对象。例如,上面的 joke 变量将产生如下输出:
{
"joke": "I'd tell you a chemistry joke but I know I wouldn't get a reaction.",
"rating": 18,
"explanation": "This joke is a play on words. The term 'reaction' refers to both a chemical process and a response from someone. The humor comes from the double meaning, implying that the joke might not be funny enough to elicit a response."
}
提示工程应由开发者主导
一个框架应该在那些并非你应用核心差异化的领域提供帮助。在 LLM 领域,许多框架提供了预构建的提示词、智能体和检索策略。然而,这些元素通常对应用的成功至关重要,应该由开发者控制,而不是框架。
此外,鉴于 LLM 技术的快速发展,捆绑预制解决方案的框架要么有过时的风险,要么会变得臃肿,因为它们需要同时支持新旧方法。
因此,RΞASON 不提供预打包的提示词或智能体模板。相反,它专注于为开发者提供优秀的工具和模式,让他们能够构建自己的解决方案。
智能体应是函数式的,并能与代码互操作
许多框架通过基于类的模板(如 new ConversationalAgent())来提供智能体创建功能。这种方法存在前面提到的缺陷:潜在的过时性和 API 锁定。
另一种选择——自定义智能体创建——更加灵活,但在面向对象编程(OOP)方法中通常会导致过多的样板代码,正如在 LangChain 等库中所见。
RΞASON 通过将智能体和动作建模为标准 JavaScript/TypeScript 函数来解决这个问题。这种函数式方法减少了样板代码并增强了互操作性。以下是一个网络搜索智能体在 RΞASON 中的示例:
import { useAgent } from 'tryreason'
import serpApi from '../actions/serp-api'
export const actions = [ serpApi ]
/**
* You are a helpful assistant that can answer questions about current events.
*/
export default async function WebAgent(userMessage: string) {
const agent = await useAgent()
return agent.run(userMessage)
}
当 LLM 选择一个动作时,RΞASON 只需使用 LLM 生成的参数调用相应的 JavaScript 函数,等待结果,然后将其传回给 LLM。智能体和动作都只是函数,这带来了更清晰、更可组合的架构。
流式传输:不仅仅是文本
LLM 生成可能是计算密集型的,通常需要数秒时间。因此,流式传输响应对于良好的用户体验至关重要。然而,仅流式传输纯文本是不够的;出于“结构化输出”部分所述的原因,开发者需要流式传输结构化数据。
RΞASON 通过 reasonStream 函数原生支持流式传输结构化输出。
import { reasonStream } from 'tryreason';
interface City {
description: string;
state: string;
country: string;
population: number;
}
export async function* GET(req: Request) {
return reasonStream<City>('tell me about San Francisco')
}
开箱即用的可观测性
要构建一个成功的 LLM 应用,可观测性至关重要。开发者需要深入了解用户查询、LLM 响应、延迟、智能体执行路径、动作调用等信息。
RΞASON 通过原生兼容 OpenTelemetry 提供了零配置可观测性。无需额外的包、装饰器或配置。只需使用 RΞASON,您就能获得开箱即用的详细追踪和监控能力。
框架对比与总结
为了清晰地说明 RΞASON 相对于其他框架常见模式的定位,下表突出了其主要差异化特点:
| 特性 / 方面 | 传统/常见方法 | RΞASON 的方法 | 核心优势 |
|---|---|---|---|
| 专有 API、JSON 模式、复杂的后处理解析 | 类型安全,零学习成本,利用现有语言特性 | ||
| 智能体/动作抽象 | 低样板代码,易于组合和测试,与现有代码无缝互操作 | ||
| 提供预构建的提示词模板和链 | 不提供预制提示词,专注于提供构建工具 | 将核心业务逻辑控制权交还开发者,避免框架锁定和过时 | |
| 流式传输 | 通常仅支持文本流或需要自定义实现 | 为复杂对象提供实时用户体验,无需手动解析流式文本 | |
| 可观测性 | 需要集成第三方库并手动添加插桩 | 开箱即用的详细追踪,简化调试和性能监控 | |
| 哲学 | 引入新的抽象和 API 来适配 LLM | 让 LLM 适配现有的编程范式 | 为 TypeScript/JavaScript 开发者提供平滑的学习曲线和更自然的开发体验 |
结论
RΞASON 仍处于早期阶段,与任何年轻项目一样,可能会遇到错误。开发团队致力于迅速解决问题。我们非常鼓励反馈和贡献——如果您遇到任何问题,请在 GitHub 上提交 issue。
RΞASON 的愿景是成为一个基础层,让开发者能够使用他们已知且喜爱的工具和范式,构建复杂、可靠且可维护的由 LLM 驱动的应用程序。我们期待看到社区用它构建出怎样的作品。
常见问题(FAQ)
RΞASON框架如何实现结构化输出?
RΞASON通过TypeScript接口定义直接从LLM获取结构化、类型安全的输出,无需复杂的文本解析,开发者只需定义interface即可获得类型化对象。
RΞASON的智能体设计有什么特点?
RΞASON采用函数式智能体设计,能与代码互操作,强调开发者主导的提示工程,将LLM作为编程原语集成到现有工作流中。
RΞASON如何支持流式传输?
RΞASON提供原生流式支持,通过reasonStream函数实现,不仅支持文本流,还能处理结构化数据的流式输出,提升应用响应性。
版权与免责声明:本文仅用于信息分享与交流,不构成任何形式的法律、投资、医疗或其他专业建议,也不构成对任何结果的承诺或保证。
文中提及的商标、品牌、Logo、产品名称及相关图片/素材,其权利归各自合法权利人所有。本站内容可能基于公开资料整理,亦可能使用 AI 辅助生成或润色;我们尽力确保准确与合规,但不保证完整性、时效性与适用性,请读者自行甄别并以官方信息为准。
若本文内容或素材涉嫌侵权、隐私不当或存在错误,请相关权利人/当事人联系本站,我们将及时核实并采取删除、修正或下架等处理措施。也请勿在评论或联系信息中提交身份证号、手机号、住址等个人敏感信息。



