在使用 Cursor 时,用户会面临着每月 500 次 “快车道” 请求的限制,一旦用超,需要排队等待或者额外付费。 一个名为 “Interactive Feedback MCP” 的开源项目为Cursor用户提供了一种创新的节省快速请求的方式:旨在通过在单次Token消耗周期内实现无限轮次的追问和反馈,从而大幅提升付费额度的使用效率。其核心原理是在Cursor准备结束当前对话时拦截该信号,并允许用户输入新的反馈或指令,使对话在保持完整上下文的情况下继续进行,而不是开启新的、消耗额外Token的会话。 什么是 Interactive Feedback MCP Interactive Feedback MCP (MCP: Model-Coordinator-Provider) 是一个本地运行的服务,它与Cursor的MCP协议集成,充当用户与AI模型之间的交互协调者。当AI完成一次响应后,此MCP会介入,询问用户是否需要进一步修改或有新的问题,并将用户的反馈无缝地融入当前对话流中。这意味着最初的一次请求所消耗的Token可以支持后续多轮的迭代优化,据称能将500次请求有效交互扩展数倍。 项目地址:https://github.com/noopstudios/interactive-feedback-mcp 安装步骤 依赖软件 Python 3.11 或更新版本。 uv(Python包管理器)。安装方法如下: Windows: pip install uv Linux/Mac: curl -LsSf https://astral.sh/uv/install.sh | sh 获取代码 clone interactive-feedback-mcp 仓库: 下载源代码也可以 下载完成后进入到代码目录。 安装 mcp 在 interactive-feedback-mcp 代码目录下执行如下命令: 该指令会创建一个虚拟环境并安装各种包(因此执行耗时也比较长)。 执行完成后,执行如下指令运行 MCP 服务器(还是在interactive-feedback-mcp 代码目录下): 在 Cursor 中配置 MCP 通过 Settings > Tools & MCP > Add Custom MCP 添加 MCP : 我这里安装后MCP没能立即启动,将 Cursor 退出重启后才会执行成功。执行成功后会有绿色状态标识。 在 Cursor 中配置 Rule 因为期望 Cursor 在每次请求结束前自动调用 MCP 服务,需要配置下 Cursor 的 Rule (Settings > Rules, Skills, Subagents > Rules > New User Rule ): 总结 通过拦截 Cursor 工作结束信号,在结束时调用 Interactive Feedback MCP 服务,允许用户在 Interactive Feedback 的交互窗口进行追问。 使得追问和修改都在同一个请求会话中进行,达到减少请求 Cursor 次数的效果。 注意: 随着会话上下文拉长,Cursor 会变得很蠢,需要适时的关闭交互窗口结束对话。 END!!!
[阅读更多...]-
Cursor 技巧 1:Interactive Feedback MCP
-
Spring AI 智能体模式 2 : Anthropic 智能体 Skill
Spring AI 新增了对 Anthropic 智能体 Skill 的支持 — 这类模块化能力可让 Claude 直接生成实际文件,而非单纯的文本描述。启用该 Skill 后,Claude 能生成可直接下载使用的 Excel 电子表格、PowerPoint 演示文稿、Word 文档和 PDF 文件。 局限性说明 Anthropic Skill 的实现方案仅适用于其自研的 Claude 系列模型,存在以下局限性: 无移植性: 该 Skill 依赖 Anthropic 的代码执行能力和 Files API 基础设施,无法在其他大模型平台(OpenAI、 Gemini 等)使用; 专属类依赖: 需使用 AnthropicChatOptions 、 AnthropicSkill 、 AnthropicSkillsResponseHelper 等 Anthropic 专属类,而非 Spring AI 的通用接口; 模型限制: 仅 Claude Sonnet 4、Sonnet 4.5 和 Opus 4 模型支持该 Skill ; 文件有效期: 通过 Anthropic Files API 生成的文件,24 小时后会自动过期; 公测功能属性: Skill API 需携带公测版本请求头,且接口规范仍可能持续迭代。 Anthropic Skill 与通用智能体 Skill 的选型建议 Spring AI 支持两种不同的智能体 Skill 实现方案,可根据业务需求选择: 选择 Anthropic 原生Skill API 的场景 需使用预构建的文档生成能力,支持 Excel、PowerPoint、Word、PDF 等格式; 希望 Skill 在沙箱化的安全云端环境中运行; 需实现团队共享的、工作空间级别的 Skill; 业务已确定基于 Claude 系列模型开发; 希望由 Anthropic 负责管理 Skill 的执行基础设施 选择通用智能体 Skill (spring-ai-agent-utils) 的场景 需要让 Skill 适配多款大模型(OpenAI、 Anthropic、 Gemini 等); Skill 需要访问本地资源、网络或自定义软件包; 希望将 Skill 与应用代码一起打包,进行版本控制; 需要对 Skill 的执行环境拥有更高的控制权; 优先考虑方案的可移植性,避免厂商锁定。 能否同时使用两种方案? 可以。在同一应用中,可通过 Anthropic 原生 Skill 实现文档生成,同时借助通用智能体 Skill 完成其他可移植的业务能力开发。二者定位不同、功能互补,可协同使用。
[阅读更多...] -
Spring AI 智能体模式 1 : Agent Skills – 模块化,可复用的能力
独立于大模型,可在自有环境运行的 Skills。 Agent Skills 是由 指令、脚本和资源构成的模块化文件夹。 AI Agent 可以发现并按需加载 Skills。相较于将知识硬编码到 prompts 中 或者为每个任务开发专用工具,Skills 提供了一种灵活扩展智能体能力的实现方式。 Spring AI 的相关实现将 Agent Skills 引入到了 java 生态,实现了大模型的可移植性 — 只需定义一次 Agent Skills,即可在 OpenAI、Anthropic、Google Gemini 及其他所有得到支持的大模型中复用。 什么是 Agent Skills? Agent Skills 是模块化的能力,表现为以 yaml 格式封装的 markdown 文件。 每个 Skill 对应一个文件夹,文件夹中需要包含一个 SKILL.md 文件。在 SKILL.md 中至少需要配置 名称 和 描述 两类元数据,同时还包含指导 Agent 完成特定任务的指令。此外 Skills 文件夹中还可以整合脚本(scripts)、模板(templates)和参考文档(references)等内容。 其中的前置元数据不仅支持简单的字符串值,还支持复杂的 yaml 结构(列表和嵌套对象等)以支持高级使用场景。 Skills 采用渐进式披露机制实现上下文的高效管理: 发现阶段: Agent 启动时,仅加载所有可用 Skill 的名称和描述,保留能够判断 Skill 相关性的核心信息即可; 激活阶段: 当待执行任务与某一 Skill 的描述匹配时,Agent 才会将 Skill 的 SKILL.md 文件中的全部指令加载到上下文中; 执行阶段: Agent 按照指令完成任务,并根据具体情况按需加载引用文件或者执行内置代码 通过这个机制,即使注册上百个 Skill , 也能保证上下文窗口的轻量化,避免资源冗余。 Tips: 关于 Agent Skills 的更多内容可以参考 Skill 官方指南 为什么要在 Spring AI 中使用 Agent Skills 无缝集成 只需要注册少量工具,即可将 Agent Skill 集成到现有 Spring AI 应用中 — 且无需对架构做任何修改。 可移植、独立于模型,无厂商锁定 与绑定特定大模型平台的实现方案不同,Spring AI 的 Agent Skill 可以适配多家大模型服务商,切换模型时无需重写代码或重构 Skill。 可复用、可组合 Skill 可以在不同的项目间共享,与业务代码一起进行版本控制。多个 Skill 可以组合实现复杂工作流,还能通过辅助脚本和参考文档进行功能扩展。同时,Spring AI 的 Skill 还可以无缝兼容已有的 Claude Code
[阅读更多...] -
SpringAI 02 – Chat Client API
ChatClient 提供了与AI模型交互的fluent API。它同时支持同步和流式编程模型。 ChatClient fluent API拥有构建传递给AI模型的提示(Prompt)的组成部分的方法。提示包含指导AI模型输出和行为的指令文本。从API的角度来看,提示由一系列消息组成。 AI模型处理两种主要类型的消息: 用户消息,即用户的直接输入。 系统消息,由系统生成以指导对话。 这些消息通常包含占位符,这些占位符在运行时会根据用户输入进行替换,以自定义AI模型对用户输入的响应。 还可以指定一些提示选项,例如: AI模型的名称,即要使用的AI模型的名称。 温度设置,控制生成输出的随机性或创造性。 这些功能使得ChatClient成为一个强大的工具,允许开发者以灵活的方式与AI模型进行交互,并通过定制化的提示和消息来优化AI模型的响应。 创建 ChatClient 使用 ChatClient.Builder 对象创建 ChatClient。你可以为任何 ChatModel SpringBoot 自动配置获取自动配置的 ChatClient.Builder 实例,或者手动创建一个。 使用自动配置的 ChatClient.Builder 在最简单的用例中,Spring AI 通过 SpringBoot 自动配置创建了一个 ChatClient.Builder 实例原型,使用时可以将其注入到类中。以下是一个简单的示例,用于检索对简单用户请求的字符串响应。 在这个简单的例子中,用户输入设置了用户消息的内容。call() 方法向 AI 模型发送请求,content() 方法将 AI 模型的响应作为字符串返回。 手动创建 ChatClient 可以通过设置属性 spring.ai.chat.client.enabled=false 来禁用 ChatClient.Builder 自动配置。当同时使用多个聊天模型时,这个配置会很有用。然后,为每个需要的 ChatModel 手动创建一个 ChatClient.Builder 实例: ChatClient Fluent API ChatClient fluent API 允许使用重载的 prompt() 方法以三种不同的方式创建提示(Prompt),以启动fluent API: prompt(): 此方法不接受任何参数就可以开始使用fluent API,允许您构建用户、系统和其它提示(prompt)部分。 prompt(Prompt prompt): 此方法接受一个 Prompt 实例作为参数,这个参数可以是一个非fluent API 创建的 Prompt 实例。 prompt(String content): 这是一个快捷方法,类似于之前重载的方法,它接受用户文本内容作为参数。 ChatClient 响应 ChatClient API 提供了几种格式化 AI 模型响应内容的方法。 返回 ChatResponse AI 模型的响应是一个由类型 ChatResponse 定义的复杂结构。ChatResponse中包含关于生成响应的元数据,并且还可以包含多个响应,称为 Generations,每个Generation都有自己的元数据。元数据还包括用于创建响应的token数量(每个token大概是 3/4 个单词)。这个信息很重要,因为托管的 AI 模型会根据每个请求中使用的token数量收费。 以下示例展示了如何获取包含元数据的 ChatResponse 对象的过程,ChatResponse实例是在 call() 方法后执行 chatResponse() 方法获得: 返回Entity 有时会希望将返回的字符串映射为某个特定的实体类的对象。entity() 方法提供了这个功能。 比如下面的 Java record类: 可以使用 entity() 方法轻松地将 AI 模型的输出结果映射为这个record类,如下所示: 还有一个重载的 entity() 方法,方法签名为 entity(ParameterizedTypeReference type),让您可以指定更复杂的类型,如List泛型: 流式响应 使用 stream() 方法可以像下面这样获得异步响应: 也可以使用 Flux<ChatResponse> chatResponse() 方法流式传输 ChatResponse 对象结果。 Spring AI将提供一个更便捷的方法,让开发者能够使用反应式 stream() 方法返回 Java Entity结果。与此同时,还可以使用结构化输出转换器( Structured Output Converter )来显式转换聚合的响应结果,就跟下面的例子一样。这个例子里也展示了fluent API 中参数的使用,具体将在文档的后续部分详细讨论。 call() 方法返回值 在 ChatClient 上指定 call() 方法后,有如下几种不同的响应类型选项。 String content(): 返回字符串格式的响应结果 ChatResponse chatResponse(): 返回包含多个Generation和响应元数据的 ChatResponse 对象,例如用于创建响应的token数量。 entity() 返回指定 Java 类型的返回结果 entity(ParameterizedTypeReference<T> type): 用于返回集合类型的结果(支持泛型)。 entity(Class type): 用于返回特定类型的结果。 entity(StructuredOutputConverter structuredOutputConverter): 可以指定 StructuredOutputConverter 实例,将字符串转换为需要的类型。 也可以使用 stream() 方法来替换 call()方法。 stream() 方法返回值 在 ChatClient 上指定 stream() 方法后,有几种响应类型选项: Flux<String> content(): 返回 AI 模型生成的字符串Flux对象。 Flux chatResponse(): 返回包含响应的额外元数据的 ChatResponse 对象的 Flux对象。 使用默认值
[阅读更多...] -
SpringAI 01 – AI概念
模型 Model 模型是旨在处理和生成信息的算法,通常模仿人类认知功能。通过从大型数据集中学习模式和洞察力,这些模型可以进行预测、生成文本、图像或其他输出,增强各行业的应用。 当前有许多不同类型的 AI 模型,每种模型会适配特定的用例。虽然 ChatGPT 及其生成式 AI 功能通过文本输入和输出吸引了用户,但许多模型和公司提供了多样化的输入和输出。在 ChatGPT 之前,许多人对 Midjourney 和 Stable Diffusion 等文本到图像的生成模型着迷。 下表根据输入和输出类型对几种模型进行了分类: Spring AI 目前支持将输入和输出处理为语言、图像和音频的模型。上表中的最后一行,即接受文本作为输入并输出数字的那行,通常被称为嵌入文本,代表 AI 模型中使用的内部数据结构。Spring AI 支持嵌入(Embedding)以支持更先进的用例。 像 GPT 这种模型的独特之处在于它们的预训练性质,正如 GPT(Chat Generative Pre-trained Transformer)中的 “P” 所表示的。这种预训练特性将 AI 转变为一种通用开发工具,但不需要更多的机器学习或模型训练背景。 提示 Prompt 提示是基于语言的输入的基础,用于引导 AI 模型产生特定输出。对于熟悉 ChatGPT 的人来说,可能提示看起来只是输入到对话框中并发送到 API 的文本。然而,它远不止于此。在许多 AI 模型中,提示的文本不仅仅是一个简单的字符串。 ChatGPT 的 API 在一个提示中会有多个文本输入,每个文本输入都被分配了一个角色。例如,有系统角色,它告诉模型如何表现并设置交互的上下文。还有用户角色,通常就是用户的输入。 创建有效的提示既是科学也是艺术。ChatGPT 是为人类对话而设计的。这与使用 SQL 等特定的数据库查询语言来进行 “提问” 有很大不同。与 AI 模型进行交流必须要像与另一个真实的人交谈一样。 这种交互方式非常重要,以至于出现了像 “提示工程” 这样类似一门学科的名词。有大量提高提示有效性的技术正在涌现。花时间精心设计提示可以极大地改善最终输出的结果。 共享提示已成为一种常用的做法,并且在这个主题上正在进行积极的学术研究。作为创建有效提示可能有多违反直觉的一个例子(例如,与SQL比较),最近的一篇研究论文发现,最有效的一个提示可以用这样的语句开头: “深呼吸,一步一步地做这个”。这应该可以让你了解为什么语言如此重要。不幸的是我们还不完全理解如何最有效地利用这项技术,即使是在之前的迭代版本中(如 ChatGPT 3.5),更不用说正在开发的新版本了。 提示模板 Prompt Template 创建有效提示涉及建立请求的上下文,并将请求中指定的部分内容替换为让用户输入的值。 这个过程使用传统的基于文本的模板引擎进行提示创建和管理。Spring AI 为此使用了 OSS 库中的 StringTemplate。 例如下面就是一个简单的提示模板: Tell me a {adjective} joke about {content}. 在 Spring AI 中,提示模板可以类比为 Spring MVC 架构中的 “视图”。提供一个模型对象(通常是 java.util.Map)来填充模板中的占位符。这样“渲染” 后的字符串就成为提供给 AI 模型的提示内容。 发送给模型的提示的具体数据格式有很大差异。最初是简单的字符串,现在提示已经发展到包括多个消息,一条消息中的每个字符串代表模型的一个不同角色。 嵌入 Embedding 嵌入是文本、图像或视频的数值表示,用于捕获输入之间的关系。 嵌入通过将文本、图像和视频转换为浮点数数组(称为向量)来工作。这些向量被用来捕获文本、图像和视频的含义。嵌入数组的长度称为向量的维度。 通过计算两段文本的向量表示之间的数值距离,应用程序可以确定用于生成嵌入向量的对象之间的相似性。 作为探索 AI 的 Java 开发人员,不需要理解这些向量表示(vector representations)背后的复杂数学理论或具体实现,只需要对它们在 AI 系统中的作用和功能有基本的了解就足够了,特别是当你将 AI 功能集成到应用程序中时。 嵌入在像检索增强生成(RAG Retrieval Augmented Generation)模式这样的实际应用中特别相关。它们使数据能够表示为语义空间中的点,这类似于欧几里得几何中的二维空间,但维度更高。这意味着就像欧几里得几何中平面上的点根据其坐标可以近或远一样,在语义空间中,点的接近程度反映了含义的相似性。对应相似主题的语句在这个多维空间中位置更接近,就像图形上彼此靠近的点一样。这种接近有助于进行文本分类、语义搜索甚至产品推荐等任务,因为它允许 AI 根据它们在这个扩展的语义景观中的 “位置” 来识别和分组相关概念。
[阅读更多...]