GEO

RΞASON框架适合构建LLM应用吗?它的TypeScript结构化输出好用吗?

2026/4/18
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函数实现,不仅支持文本流,还能处理结构化数据的流式输出,提升应用响应性。

Roger深圳
本文由 Roger 审核,最后更新于 2026年7月2日
联系编辑 →
← 返回文章列表
分享到:微博

版权与免责声明:本文仅用于信息分享与交流,不构成任何形式的法律、投资、医疗或其他专业建议,也不构成对任何结果的承诺或保证。

文中提及的商标、品牌、Logo、产品名称及相关图片/素材,其权利归各自合法权利人所有。本站内容可能基于公开资料整理,亦可能使用 AI 辅助生成或润色;我们尽力确保准确与合规,但不保证完整性、时效性与适用性,请读者自行甄别并以官方信息为准。

若本文内容或素材涉嫌侵权、隐私不当或存在错误,请相关权利人/当事人联系本站,我们将及时核实并采取删除、修正或下架等处理措施。也请勿在评论或联系信息中提交身份证号、手机号、住址等个人敏感信息。