今天分享一个用纯 Node.js 实现知识库(RAG)的最简方案。 RAG 的核心思路其实并不复杂: - 对文档进行内容分割,将文档拆解成一个个小的语义分块(chunk); - 将这些分块通过大模型解析成向量(embedding)并储存在向量数据库中; - 当用户输入一个查询时,同样将查询进行向量化处理,通过向量数据库检索高度相关的知识片段; - 最后将这些片段整合到发送给大模型的上下文中,提升回答的精准度和相关性。 技术栈: 安装依赖 npm install @libsql/client @ai-sdk/openai-compatible ai dotenv 添加环境变量 先在项目根目录创建 .env: AIPROXY_API_KEY=your_api_key_here 先把最基础的依赖准备好,包括模型客户端、本地数据库客户端,以及一组演示知识。 import 'dotenv/confi。
太快了!只需一分钟,你就能开发出一个支持流式响应(Streaming)的 AI 聊天应用。 我们将使用 Next.js 作为框架,以及 Vercel 推出的 AI SDK 来实现。AI SDK 是目前TS/JS开发者集成大模型(LLM)最简单、最强大的工具包。 核心步骤:一分钟挑战 1. 初始化项目 在终端运行以下命令创建一个新的 Next.js 项目: npx create-next-app@latest ai-app --typescript --tailwind --eslint cd ai-app 2. 安装 AI SDK 依赖 安装核心依赖及 OpenAI 适配器。由于采用我自己写的 API 代理服务 AIProxy Shop (OpenAI 接口兼容),需安装 @ai-sdk/openai-compatible 以实现接口适配: npm install ai @ai-sdk/o。
在大多数 AI 应用里,Token 超支通常不是因为“模型太贵”,而是因为我们把太多不该发给模型的信息都发过去了。 常见浪费场景: - 每次请求都塞入超长 system prompt; - 不区分意图,所有问题都走同一个大模型链路; - RAG 一律检索 top_k=10,即使只是闲聊; - 能本地回答的问题,也走远端模型。 这篇文章用 semantic-router 做一个“前置语义分流层”,把请求先路由,再决定: - 要不要调用大模型; - 调哪个链路(闲聊、知识库、高成本推理); - 该附带多少上下文。 核心目标只有一个:在不明显牺牲效果的前提下,减少每次请求的 平均 Token 消耗。 什么是 Semantic Router semantic-router 是一个超轻量决策层。它不依赖先生成一段大模型输出再做判断,而是用向量语义匹配做意图分流。 和“先让 LLM 判断该走哪个工具”。
在 AI 应用里,流式输出(streaming output)几乎已经成了默认选项。用户不用等模型把整段内容都生成完,界面就可以先把正在生成的部分展示出来,整体体验会自然很多。 但在渲染流式输出的 Markdown 内容时,会发现一个问题:内容虽是“逐字追加”,渲染却是“整块渲染”。 这就会出现几个很典型的问题: - 页面闪烁:每次 token 更新都触发整段 Markdown 重新渲染,视觉上会有明显抖动。 - 性能下降:内容越长,重新解析和重新渲染的成本就越高。 - 结构不稳定:代码块、表格、公式这类结构化内容在未闭合时很容易渲染异常。 问题的根源并不复杂:我们把“流式追加文本”当成了“重新渲染整篇文档”来处理。 一个更合适的思路:分块渲染 为了优化上述问题,我们可以不让 Markdown 组件每一次都从头解析整段字符串,而是先把流式文本拆成一组相对稳定的内容块,再分别渲染。 核心原则。