关于 Cursor 的一些学习记录

news2025/1/18 21:34:23

文章目录

    • 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Oracle与PyQt6的电子病历多模态大模型图形化查询系统编程构建

一、引言 1.1 研究背景阐述 在当今数字化时代,医疗行业正经历着深刻的变革,数字化转型的需求日益迫切。电子病历(EMR)作为医疗信息化的核心,其管理的高效性和数据利用的深度对于提升医疗服务质量、优化临床决策以及推动医学研究具有至关重要的意义。传统的电子病历管理系…

算法(蓝桥杯)贪心算法7——过河的最短时间问题解析

一、题目描述 在漆黑的夜里&#xff0c;N位旅行者来到了一座狭窄且没有护栏的桥边。他们只带了一只手电筒&#xff0c;且桥窄得只够让两个人同时过。如果各自单独过桥&#xff0c;N人所需的时间已知&#xff1b;若两人同时过桥&#xff0c;则所需时间是走得较慢的那个人单独行动…

《贪心算法:原理剖析与典型例题精解》

必刷的贪心算法典型例题&#xff01; 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法1——数塔问题-CSDN博客 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法2——需要安排几位师傅加工零件-CSDN博客 算法&#xff08;蓝桥杯&#xff09;贪心算法3——二维数组排序与贪心算…

SQL2000在win10上安装的方法

安装前最好先关闭防火墙和一些杀毒软件&#xff0c;因为这些软件在安装过程中可能会碰到注册表等一下杀毒软件比较敏感的地带&#xff0c;如果违反杀毒软件的规则会被当做病毒强行终止删除 首相找到C盘下window文件中的sysWOW64文件 鼠标右键&#xff0c;点击属性、安全、高级 …

【12】Word:张老师学术论文❗

目录 题目 ​NO2 NO3 NO4 NO5 NO6 NO7.8 题目 NO2 布局→页面设置→纸张&#xff1a;A4→页边距&#xff1a;上下左右边距→文档网格&#xff1a;只指定行网格→版式&#xff1a;页眉和页脚&#xff1a;页脚距边界&#xff1a;1.4cm居中设置论文页码&#xff1a;插入…

软件授权管理中的软件激活向导示例

软件激活向导示例 在软件许可中&#xff0c;提供许可应该是简单和安全的。这适用于想要在中央许可证服务器上创建新许可证的软件开发人员&#xff0c;也适用于需要在其设备上获得许可证的最终用户。如果所讨论的系统有互联网连接&#xff0c;或是暂时的连接&#xff0c;就可以…

基于微信小程序的摄影竞赛系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

在IDEA中使用通义灵码插件:全面提升开发效率的智能助手

在IDEA中使用通义灵码插件&#xff1a;全面提升开发效率的智能助手 随着软件开发行业对效率和质量要求的不断提高&#xff0c;开发者们一直在寻找能够简化工作流程、提升代码质量的工具。阿里云推出的通义灵码插件正是这样一个旨在帮助开发者更高效地编写高质量代码的强大工具…

【Unity3D】利用Hinge Joint 2D组件制作绳索效果

目录 一、动态绳索 &#xff08;可移动根节点&#xff09; 二、静态绳索 三、利用Skinning Editor(Unity2022.3.15f1正常使用) 四、注意事项 一、动态绳索 &#xff08;可移动根节点&#xff09; 动态绳索 DynamicRope空物体 Anchor和whitecircle是相同位置的物体&#xff…

游戏引擎学习第80天

Blackboard&#xff1a;增强碰撞循环&#xff0c;循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改&#xff0c;以便实现一些新的功能。具体来说&#xff0c;是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏&#xff0c;目标是构建一些更丰富…

2025.1.15——四、布尔注入

题目来源&#xff1a;ctfhub技能树 目录 一、基本操作&#xff1a;整理已知信息&#xff0c;得到本题为布尔注入 方法一&#xff1a;手工盲注&#xff08;不推荐&#xff09; step 1&#xff1a;判断具体形式 step 2&#xff1a;查询字段数 step 3&#xff1a;通过回显判…

PE文件:节表-添加节

在所有节的空白区域都不够存放我们想要添加的数据时&#xff0c;这个时候可以通过添加节来扩展我们可操作的空间去存储新的数据&#xff08;如导入表、代码或资源&#xff09;。 过程步骤 1.判断是否有足够的空间添加节表 PE文件的节表紧跟在PE头之后&#xff0c;每个节表的…

【前端动效】HTML + CSS 实现打字机效果

目录 1. 效果展示 2. 思路分析 2.1 难点 2.2 实现思路 3. 代码实现 3.1 html部分 3.2 css部分 3.3 完整代码 4. 总结 1. 效果展示 如图所示&#xff0c;这次带来的是一个有趣的“擦除”效果&#xff0c;也可以叫做打字机效果&#xff0c;其中一段文本从左到右逐渐从…

Python基于Django的图像去雾算法研究和系统实现(附源码,文档说明)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

了解 BM25:一种高效的文本检索算法

什么是 BM25&#xff1f; BM25&#xff08;Best Matching 25&#xff09;是一种在信息检索领域非常著名的算法&#xff0c;它属于 TF-IDF 的改进版本&#xff0c;是许多现代搜索引擎和文本检索系统的核心算法之一。BM25 基于概率检索模型&#xff08;Probabilistic Informatio…

PenGymy论文阅读

这里发现idea被人家先发了&#xff0c;没办法&#xff0c;资料收集的不够全面&#xff0c;现在来学习一下这个项目 这篇论文的贡献如下&#xff1a; 总的来说&#xff0c;他的主要工作是构建逼真的仿真环境&#xff0c;然后根据这个仿真环境生成真实的靶场&#xff0c;使得这个…

猫贫血吃什么能快速补血?

各位铲屎官们&#xff0c;看到自家猫咪无精打采、小脸苍白&#xff0c;是不是特别心疼&#xff1f;贫血可是猫咪健康的大敌&#xff0c;今天就来给大家支支招&#xff0c;哪些食物和方法能让猫咪快速补血&#xff0c;恢复活力&#xff01; 一、红肉及内脏类 红肉是补血的“主力…

Redis 性能优化:多维度技术解析与实战策略

文章目录 1 基准性能2 使用 slowlog 优化耗时命令3 big key 优化4 使用 lazy free 特性5 缩短键值对的存储长度6 设置键值的过期时间7 禁用耗时长的查询命令8 使用 Pipeline 批量操作数据9 避免大量数据同时失效10 客户端使用优化11 限制 Redis 内存大小12 使用物理机而非虚拟机…

wireshark抓路由器上的包 抓包路由器数据

文字目录 抓包流程概述设置抓包配置选项 设置信道设置无线数据包加密信息设置MAC地址过滤器 抓取联网过程 抓包流程概述 使用Omnipeek软件分析网络数据包的流程大概可以分为以下几个步骤&#xff1a; 扫描路由器信息&#xff0c;确定抓包信道&#xff1b;设置连接路由器的…

在 Fluent 网格划分中使用薄网格特征

薄体模型的网格划分策略 薄体网格划分对于有效模拟薄壁结构或厚度明显小于其他尺寸的几何形状非常有利。当使用此类几何结构时&#xff0c;传统的体积网格划分技术可能会导致单元数量增加&#xff0c;因为它们试图捕获具有许多不必要单元的薄尺寸。薄体网格划分通过专门沿薄方…