项目:智能文本摘要器
级别: 初级 时间: 1 小时 技术栈: Next.js, Vercel AI SDK
概览
构建一个工具,用户可以粘贴长文章或报告,并获得简明的要点摘要。
核心概念:
- 提示工程: 如何要求特定格式。
- Token 限制: 处理过长的文本。
- UI 状态: 加载中 vs. 流式传输。
步骤 1: UI
创建一个简单的两列布局:输入 (Textarea) 和输出 (Markdown)。
tsx
// app/page.tsx
'use client';
import { useCompletion } from 'ai/react';
export default function Summarizer() {
const { complete, completion, isLoading } = useCompletion({
api: '/api/summarize',
});
return (
<div className="grid grid-cols-2 gap-4 p-4 h-screen">
<textarea
className="p-4 border rounded"
placeholder="在此粘贴长文本..."
onChange={(e) => complete(e.target.value)}
/>
<div className="p-4 bg-gray-50 rounded prose">
{isLoading && !completion ? '摘要生成中...' : completion}
</div>
</div>
);
}步骤 2: API 路由
我们使用特定的提示词来强制结构化。
typescript
// app/api/summarize/route.ts
import { openai } from '@ai-sdk/openai';
import { streamText } from 'ai';
export async function POST(req: Request) {
const { prompt } = await req.json();
// 基础 Token 检查 (大约 1 字符 = 0.25 tokens)
if (prompt.length > 50000) {
return new Response('文本太长', { status: 400 });
}
const result = await streamText({
model: openai('gpt-4o-mini'), // 使用便宜的模型进行摘要
system: "You are a professional editor.",
prompt: `
Summarize the following text.
Format:
1. One sentence high-level summary.
2. Bullet points for key details.
3. A "Conclusion" section.
Text:
${prompt}
`,
});
return result.toDataStreamResponse();
}进阶:处理长文本 (分块)
如果文本超过上下文窗口 (GPT-4o 为 128k tokens),你必须分割它。
策略:
- 将文本分割成 10k 的块。
- 单独摘要每个块。
- 将摘要汇总在一起进行再次摘要。
扩展
- URL 输入: 使用像
cheerio这样的库在摘要之前获取并解析 URL。 - 导出: 添加“下载 PDF”按钮。