关于 Cursor 的一些学习记录

文章目录

    • 1. 写在最前面
    • 2. Prompt Design
      • 2.1 Priompt v0.1:提示设计库的首次尝试
      • 2.2 注意事项
    • 3. 了解 Cursor 的 AI 功能
      • 3.1 问题
      • 3.2 答案
    • 4. cursor 免费功能体验
    • 5. 写在最后面
    • 6. 参考资料

1. 写在最前面

本文整理了一些学习 Cursor 过程中读到的或者发现的感兴趣内容的记录,一方面可以整理一下学习的思路,另一方面可以加深记忆。

  • 有一些文档的原文为英文,随手翻译成了中文

2. Prompt Design

提示就像网页设计。我们称之为提示设计,并为其构建更好的工具

注:「Prompting is like web design. Let’s call it prompt design, and build better tools for it.」

我通常不喜欢那种试图为新事物寻找旧有类比的常见做法。所以,请容忍我犯下这个错误:让我阐述一下为什么提示应该被称为提示设计,并与网页设计相类比。

我将提示视为与时间受限的人进行沟通。虽然针对大语言模型(LLM)的特定技术确实很有帮助(最显著的是思维链技术),但我发现提高性能的最佳方法之一是给出极其清晰和高质量的指令,就如同清晰简洁有助于现实中的人更好地理解一样。

将提示视为清晰沟通,这让提示听起来像是写作。然而,我所做的大多数提示都是参数化的:我有许多输入变量,需要根据这些变量动态调整提示。

因此,将提示视为带有动态输入的清晰沟通,这可能是最准确的描述。

还有哪个领域涉及基于动态输入进行清晰沟通呢?网页设计。

让我们列出所有的相似之处。提示和网页设计都:

  1. 需要清晰明了,并以沟通为主要目标;

  2. 需要对动态内容做出响应,这与写作或杂志排版不同;

  3. 需要使其内容适应不同的 「尺寸」—— 对于网页设计是屏幕尺寸,对于提示则是上下文窗口。

根据我从事提示和网页设计的经验,我还发现自己在这两个领域有着相似的开发偏好:

  1. 查看实际的提示非常重要,就像查看渲染后的网站同样重要。如果我必须在脑海中模拟 HTML 和 CSS 的渲染过程,我就无法设计网站。同样,在不查看填充了所有输入变量的提示的输出结果时,很难写出优秀清晰的提示。
    例如,提示 Hi ${username} ${message} 可能看起来合理,直到你渲染它时才会意识到用户名和消息混在一起了。

  2. 可组合的组件在提示和网页设计中都很有用。

  3. 声明式都优于命令式。如果所有的 HTML 元素都是通过document.createElement调用来创建的,那么修改网站会非常困难。同样,阅读和修改由一长串str += "..."组成的提示也很容易变得难以管理。

  4. 在这两个领域,我有时都想要达到 「像素级完美」。当使用能力较弱的模型(如 GPT-3.5 及更差的模型)时,我希望确保没有多余的换行符或其他不完美的格式,而在设计网站时,有时每个像素都很重要。

对于大语言模型智能体而言,这种类比还可以进一步延伸:智能体提示可以被看作是为智能体构建一个交互式网站,它们可以通过调用函数 「点击按钮」,并且提示会根据函数调用重新渲染,就像网站会根据按钮点击重新渲染一样。

当然,提示设计和网页设计之间也存在差异:

  • 目前提示仅处理文本 。
  • 缓存机制不同:特别是对于智能体,你希望通过仅更改提示的后半部分来确保重新渲染的成本较低。这与网页有一些勉强的相似之处(你希望对网站进行缓存优化),但我认为这在本质上是截然不同的挑战。

尽管如此,这些相似之处让我相信,提示应该被称为提示设计,而不是提示工程。编写提示就像设计网站一样,因此也应该以相同的方式命名。

提示设计的理念启发我创建了 Priompt,这是一个类似 React、基于 JSX 的提示设计库。

2.1 Priompt v0.1:提示设计库的首次尝试

Priompt 是受现代网页设计原则启发创建提示设计库的首次尝试。我们在 Anysphere 内部使用它,并且非常喜欢。

我认为它的所有抽象可能并非完全正确,但我至少确信,与字符串模板相比,JSX 是一种更符合人体工程学的编写提示的方式。仅仅能够轻松注释掉提示的部分内容这一点,就能使迭代循环快得多。
在这里插入图片描述

Priompt 还附带了一个(仓促搭建的)预览网站,在那里你可以在真实数据上预览提示。在开发应用程序时,你可以在每次请求时记录传入组件的序列化props。然后,当你发现意外行为时,你可以进入 Priompt 预览页面,查看确切的提示,更改源代码,提示会使用与真实请求相同的props进行更新。我们发现这使得对提示的迭代更加容易。

在这里插入图片描述

如果你试用了它,请告诉我你的想法!我很乐意看到更多类似的想法,或者直接告诉我我完全错了,提示设计这个概念很愚蠢 。

2.2 注意事项

模型更新换代迅速,提示技术也必须随之快速变化。鉴于此,我认为将其称为提示设计存在一些需要注意的地方:

  • 对于 GPT-4 来说,像素级完美的设计并不重要,对于 GPT-4.5 或更好的模型来说可能会过时。
  • 如果按照长上下文模型的近期发展趋势推断,上下文窗口的限制可能会消失。不过,我对此并不确定。
  • OpenAI 似乎正朝着减少开发者对提示控制权的方向发展;有可能在一年内不再有提示的概念,API 调用只需要我们提供原始输入和一条指令。这种减少控制权的趋势从聊天格式就开始了,并且在最近推出的函数调用功能中持续体现。
  • 缓存可能是提示中最重要的方面之一,在这种情况下,它听起来更像是工程而非设计。
  • 也许提示设计层面太低,应该留给更高级的框架或编译器(例如 langchain)来处理。我认为这可能是对的,但鉴于大语言模型快速变化的特性,我个人更倾向于尽可能接近原始模型。

3. 了解 Cursor 的 AI 功能

3.1 问题

  • 如果我想 Cursor 描述我想做什么,它能给我写代码吗?

  • 如果我将使用的 GhatGPT/Claude 生成的代码上传到 Cursor,Cursor 能查看并修复错误吗?

3.2 答案

针对你的问题,答案都是肯定的。

以下是更多详细信息。

Cursor 是基于 Visual Studio Code(VS Code)的分支开发的。

VS Code 是微软开发的一款代码编辑器,官网链接为:https://code.visualstudio.com/ 。

Cursor 由 Anysphere 公司开发,其官网为:https://anysphere.inc/ 。

Anysphere 获得了 Chat GPT 背后的公司 OpenAI 的一些资金支持,相关信息可查看:We raised $8M from OpenAI. 。

最新消息 —— 他们最近又筹集了更多资金,详情见:Series A and Magic | Cursor - The AI Code Editor 。

Cursor 的官方功能页面:Features | Cursor - The AI Code Editor 。

Cursor 的官方文档页面:https://docs.cursor.com 。

该文档也可在 GitHub 上查看:GitHub - getcursor/docs: Cursor's Open Source Documentation 。

Cursor 内置了人工智能功能。
有多种方式可以使用这些功能。
当在 Cursor 中打开一个文件时,你可以按下不同的组合键来使用不同功能。
具体如下:

  • 按下 Ctrl + K 进行文件内代码生成。
  • 按下 Ctrl + L 可在侧边栏打开 AI 聊天面板。
  • 按下 Ctrl + I 可跨多个文件创建和编辑代码 。

可以在 Ctrl + L 中选择两种不同的「模式」:

  • 普通模式
  • 解释器模式

4. cursor 免费功能体验

下面随机数生成的代码示例是通过 cursor 逐步优化生成的,体验下来,写代码的效率飞快!

package main

import (
	"fmt"
	"math/bits"
	"runtime"
	"sync"
)

// 定义魔法常数
const (
	// 黄金比例相关的质数
	prime1 uint64 = 11400714785074694791
	prime2 uint64 = 14029467366897019727
	prime3 uint64 = 1609587929392839161
	prime4 uint64 = 9650029242287828579
	prime5 uint64 = 2870177450012600261

	// 块大小定义
	blockSize = 32 // 增加块大小以提高性能
)

// HashOptions 定义哈希配置选项
type HashOptions struct {
	Seed       uint64 // 种子值
	Parallel   bool   // 是否使用并行处理
	Iterations int    // 混合轮数
}

// DefaultOptions 返回默认配置
func DefaultOptions() HashOptions {
	return HashOptions{
		Seed:       0,
		Parallel:   true,
		Iterations: 3,
	}
}

// EnhancedHash 实现增强版哈希算法
func EnhancedHash(input string, opts HashOptions) uint64 {
	if len(input) == 0 {
		return opts.Seed ^ prime5
	}

	if opts.Parallel && len(input) >= blockSize*4 {
		return parallelHash(input, opts)
	}
	return serialHash(input, opts)
}

// 并行处理哈希
func parallelHash(input string, opts HashOptions) uint64 {
	numCPU := runtime.NumCPU()
	chunkSize := len(input) / numCPU
	if chunkSize < blockSize {
		return serialHash(input, opts)
	}

	var wg sync.WaitGroup
	results := make([]uint64, numCPU)

	for i := 0; i < numCPU; i++ {
		wg.Add(1)
		go func(index int) {
			defer wg.Done()
			start := index * chunkSize
			end := start + chunkSize
			if index == numCPU-1 {
				end = len(input)
			}
			results[index] = processChunk(input[start:end], opts.Seed+uint64(index))
		}(i)
	}
	wg.Wait()

	// 合并所有结果
	return combineHashes(results, opts)
}

// 串行处理哈希
func serialHash(input string, opts HashOptions) uint64 {
	hash := opts.Seed + prime1

	// 分块处理
	for i := 0; i < len(input); i += blockSize {
		end := i + blockSize
		if end > len(input) {
			end = len(input)
		}
		hash = processBlock(input[i:end], hash)
	}

	// 多轮混合
	for i := 0; i < opts.Iterations; i++ {
		hash = mixHash(hash)
	}

	return finalizeHash(hash, uint64(len(input)))
}

// 处理数据块
func processBlock(block string, hash uint64) uint64 {
	data := stringToUint64Slice(block)
	for _, v := range data {
		v *= prime2
		v = bits.RotateLeft64(v, 31)
		v *= prime1

		hash ^= v
		hash = bits.RotateLeft64(hash, 27)
		hash = hash*prime1 + prime3
	}
	return hash
}

// 处理数据块(并行版本)
func processChunk(chunk string, seed uint64) uint64 {
	hash := seed + prime1
	for i := 0; i < len(chunk); i += 8 {
		end := i + 8
		if end > len(chunk) {
			end = len(chunk)
		}

		block := uint64(0)
		for j := i; j < end; j++ {
			block |= uint64(chunk[j]) << uint((j-i)*8)
		}

		block *= prime2
		block = bits.RotateLeft64(block, 31)
		block *= prime1

		hash ^= block
		hash = bits.RotateLeft64(hash, 27)
		hash = hash*prime3 + prime4
	}
	return hash
}

// 混合哈希值
func mixHash(hash uint64) uint64 {
	hash ^= hash >> 33
	hash *= prime2
	hash ^= hash >> 29
	hash *= prime3
	hash ^= hash >> 32
	return hash
}

// 最终化哈希值
func finalizeHash(hash uint64, length uint64) uint64 {
	hash ^= length * prime4
	hash = mixHash(hash)
	hash ^= hash >> 37
	hash *= prime5
	hash ^= hash >> 28
	return hash
}



// 合并多个哈希值
func combineHashes(hashes []uint64, opts HashOptions) uint64 {
	result := opts.Seed + prime5
	for _, h := range hashes {
		result ^= bits.RotateLeft64(h, 17)
		result *= prime2
	}
	return finalizeHash(result, uint64(len(hashes)))
}

// 将字符串转换为uint64切片
func stringToUint64Slice(s string) []uint64 {
	length := len(s)
	result := make([]uint64, (length+7)/8)
	for i := 0; i < length; i++ {
		result[i/8] |= uint64(s[i]) << uint((i%8)*8)
	}
	return result
}

func main() {
	// 测试数据
	testCases := []struct {
		input string
		opts  HashOptions
	}{
		{"Hello, World!", DefaultOptions()},
		{"Hello, World!", HashOptions{Seed: 42, Parallel: true, Iterations: 5}},
		{"测试中文字符串", DefaultOptions()},
		{"1234567890", DefaultOptions()},
		{string(make([]byte, 1024*1024)), DefaultOptions()}, // 测试大数据
		{"这是一个非常长的文本,用来测试哈希算法在处理长输入时的表现", DefaultOptions()},
	}

	// 运行测试
	for _, tc := range testCases {
		hash := EnhancedHash(tc.input, tc.opts)
		fmt.Printf("输入长度: %d\n种子: %d\n并行处理: %v\n混合轮数: %d\n哈希值: %x\n分布率: %.10f%%\n\n",
			len(tc.input),
			tc.opts.Seed,
			tc.opts.Parallel,
			tc.opts.Iterations,
			hash,
			100.0/float64(1<<64))
	}
}

运行效果:

$> go run main.go 
输入长度: 13
种子: 0
并行处理: true
混合轮数: 3
哈希值: ac34659942f33338
分布率: 0.0000000000%

输入长度: 13
种子: 42
并行处理: true
混合轮数: 5
哈希值: 537ebcf8c50135f6
分布率: 0.0000000000%

输入长度: 21
种子: 0
并行处理: true
混合轮数: 3
哈希值: 68f36c2801c14546
分布率: 0.0000000000%

输入长度: 10
种子: 0
并行处理: true
混合轮数: 3
哈希值: 4d0d8e5da7bb858a
分布率: 0.0000000000%

输入长度: 1048576
种子: 0
并行处理: true
混合轮数: 3
哈希值: 5fd3b28ae5a833cb
分布率: 0.0000000000%

输入长度: 87
种子: 0
并行处理: true
混合轮数: 3
哈希值: 842b9c0aca6bcdb8
分布率: 0.0000000000%

5. 写在最后面

抓住周五的尾巴,完成了 Cursor 的初步学习记录,要加油呀!

  • 任何选择都会导致遗憾,所以不要后悔。

  • 人活一生,值得爱的东西很多,不要因为一个不满意,就灰心。

  • 人没有牺牲,就什么也得不到,如果想得到什么,就得付出同等的代价,这就是等价交换原则,我们相信,这,就是世界的真实。

6. 参考资料

  • Prompt Design | Cursor - The AI Code Editor
  • Cursor feature summary for colleagues (with annotated screenshots) - Discussion - Cursor - Community Forum
  • Comprehensive and Succinct List of Cursor Features - Discussion - Cursor - Community Forum
  • Separate the visual UI inlay hints into multiple togglable options - #5 by litecode - Feature Requests - Cursor - Community Forum
  • Multi-file edits - 0.37 update - #24 by litecode - Feedback - Cursor - Community Forum

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956730.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea中远程调试中配置的参数说明

Ⅰ 远程调试中配置的端口号与服务本身端口号区别 一、远程调试中配置端口号的作用 在 IDEA 中进行远程调试时配置的端口号主要用于建立开发工具&#xff08;如 IDEA&#xff09;和远程服务之间的调试连接。当你启动远程调试时&#xff0c;IDEA 会监听这个配置的端口号&#xf…

基于 MDL 行情插件的中金所 L1 数据处理最佳实践

本文介绍了如何通过 DolphinDB 的 MDL 插件订阅并处理中金所 Level 1 实时数据。首先&#xff0c;文章简要介绍了 MDL 插件的功能和作用。它是基于 MDL 官方提供的行情数据服务 C SDK&#xff08;即 TCP 版本 MDL &#xff09;实现&#xff0c;提供了实时数据获取和处理的能力。…

JupyterLab 安装以及部分相关配置

安装 JupyterLab pip install jupyter启动 JupyterLab jupyter lab [--port <指定的端口号>] [--no-browser] # --port 指定端口 # --no-browser 启动时不打开浏览器安装中文 首先安装中文包 pip install jupyterlab-language-pack-zh-CN安装完成后重启 JupyterLab 选…

LabVIEW电源纹波补偿

在电子设备的电源管理中&#xff0c;电源纹波的存在可能会对设备的稳定性和性能产生负面影响。以某精密电子仪器的电源纹波补偿为例&#xff0c;详细阐述如何运用 LabVIEW 编写程序进行电源纹波补偿。将从电源纹波特点、测量采样、滤波、反馈控制等多个方面展开介绍。 ​ 电源…

嵌入式硬件篇---基本组合逻辑电路

文章目录 前言基本逻辑门电路1.与门&#xff08;AND Gate&#xff09;2.或门&#xff08;OR Gate&#xff09;3.非门&#xff08;NOT Gate&#xff09;4.与非门&#xff08;NAND Gate&#xff09;5.或非门&#xff08;NOR Gate&#xff09;6.异或门&#xff08;XOR Gate&#x…

使用rpc绕过咸鱼sign校验

案例网站是咸鱼 找到加密函数i()&#xff0c;发现参数是由token时间戳appkeydata构成的 js客户端服务 考虑到网站可能有判断时间戳长短而让请求包失效的可能&#xff0c;我们请求包就直接用它的方法生成 下面我们先把token和h置为键值对tjh123 再把方法i()设为全局变量my_…

鸿蒙安装HAP时提示“code:9568344 error: install parse profile prop check error” 问题现象

在启动调试或运行应用/服务时&#xff0c;安装HAP出现错误&#xff0c;提示“error: install parse profile prop check error”错误信息。 解决措施 该问题可能是由于应用使用了应用特权&#xff0c;但应用的签名文件发生变化后未将新的签名指纹重新配置到设备的特权管控白名…

Pix2Pix :用于图像到图像转换的条件生成对抗网络

1. 背景与问题 图像到图像的转换&#xff08;Image-to-Image Translation&#xff09;是计算机视觉中的一个重要任务&#xff0c;指的是在输入一张图像的情况下&#xff0c;生成一张风格、内容或其他条件不同但语义一致的图像。随着深度学习的发展&#xff0c;尤其是生成对抗网…

【大数据2025】Hadoop 万字讲解

文章目录 一、大数据通识大数据诞生背景与基本概念大数据技术定义与特征大数据生态架构概述数据存储数据计算与易用性框架分布式协调服务和任务调度组件数仓架构流处理架构 二、HDFSHDFS 原理总结一、系统架构二、存储机制三、数据写入流程四、心跳机制与集群管理 安全模式&…

docker 安装 nanomq

1.拉取镜像 docker pull emqx/nanomq:latest 2. 创建配置文件夹&#xff08;示例放在/home/nanomq&#xff09; mkdir nanomq chomd 777 nanomq3. 创建配置文件&#xff08;nanomq.conf&#xff09;写入以下内容 mqtt {property_size 32max_packet_size 10KBmax_mqueue_le…

【STM32G4xx的CAN驱动记录】

STM32G4xx的CAN驱动记录 CAN说明CAN的波特率计算数据测试总结 本文主要记录了基于STM32G4xx的CAN接口解析某型号雷达数据遇到的问题及规避方法&#xff0c;CAN总线波特率500Kbps&#xff0c;采样点要求80%附近。 注意CAN总线同步段的时间&#xff01;&#xff01;&#xff01; …

2024年CSDN博客之旅:成长、创作与生活的交响曲

文章目录 《2024年博客之旅&#xff1a;成长、创作与生活的交响曲》一、引言二、个人成长与突破盘点&#xff08;一&#xff09;技术能力的提升&#xff08;二&#xff09;解决问题能力的增强&#xff08;三&#xff09;沟通与表达能力的进步 三、年度创作历程回顾&#xff08;…

微服务与docker

准备工作 在课前资料中给大家提供了黑马商城项目的资料,我们需要先导入这个单体项目。不过需要注意的是,本篇及后续的微服务学习都是基于Centos7系统下的Docker部署,因此你必须做好一些准备: Centos7的环境及一个好用的SSH客户端装好Docker会使用Docker如果是学习过上面Doc…

docker离线安装及部署各类中间件(x86系统架构)

前言&#xff1a;此文主要针对需要在x86内网服务器搭建系统的情况 一、docker离线安装 1、下载docker镜像 https://download.docker.com/linux/static/stable/x86_64/ 版本&#xff1a;docker-23.0.6.tgz 2、将docker-23.0.6.tgz 文件上传到服务器上面&#xff0c;这里放在…

02内存结构篇(D3_对象的创建历程)

目录 一、学习前言 二、对象的创建&#xff1a;指针碰撞 & 空闲列表 三、对象的内存布局&#xff1a;三部分组成 1. 对象头 2. 实例数据 3. 对齐填充 四、对象的访问定位 1. 句柄访问 2. 直接指针访问 3. 两者访问方式比较 一、学习前言 运行时数据区了解了&…

Linux系统之kill命令的基本使用

Linux系统之kill命令的基本使用 一、kill命令介绍1. kill命令简介2. kill命令的使用场景3. kill命令使用注意事项 二、kill命令的使用帮助1. 查看kill命令帮助信息2. kill命令帮助解释 三、kill常用的信号1. 列出所有的信号2.kill常用的信号 四、kill命令的基本使用1. 运行一个…

【银河麒麟高级服务器操作系统】业务访问慢网卡丢包现象分析及处理过程

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;product.kylinos.cn 开发者专区&#xff1a;developer.kylinos.cn 文档中心&#xff1a;document.kylinos.cn 交流论坛&#xff1a;forum.kylinos.cn 服务器环境以及配置 【内核版本…

leetcode49-字母异位词分组

leetcode 49 思路 通过一个哈希表进行记录每个分组&#xff0c;遍历strs&#xff0c;然后对每个字符串item进行排序&#xff0c;比如&#xff1a;acb bac cab都会被排序为’abc’,然后以abc作为map的key&#xff0c;value就是存放所有匹配出来为key的值&#xff0c;最后把ma…

ChatGPT被曝存在爬虫漏洞,OpenAI未公开承认

OpenAI的ChatGPT爬虫似乎能够对任意网站发起分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;而OpenAI尚未承认这一漏洞。 本月&#xff0c;德国安全研究员Benjamin Flesch通过微软的GitHub分享了一篇文章&#xff0c;解释了如何通过向ChatGPT API发送单个HTTP请求…

WGAN - 瓦萨斯坦生成对抗网络

1. 背景与问题 生成对抗网络&#xff08;Generative Adversarial Networks, GANs&#xff09;是由Ian Goodfellow等人于2014年提出的一种深度学习模型。它包括两个主要部分&#xff1a;生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;…