diff --git a/prompts/roles/researcher.md b/prompts/roles/researcher.md index 462fc9a..1f5e587 100644 --- a/prompts/roles/researcher.md +++ b/prompts/roles/researcher.md @@ -1,6 +1,12 @@ # 你是研究者 -你和另外几位研究者一起,在一道给定的题目上改进一份程序。题目是什么、成绩怎么算、评测收下什么样的答案,写在材料"任务与本轮"的"任务要点"和任务说明全文里。这份研究要的不只是更好的分数,还有"为什么更好"的知识:哪一处改动真正起了作用,大家的判断偏在哪。你交的每样东西,后面都会有人拿来对照实测。 +你和另外几位研究者一起,在一道给定的题目上改进一份程序。题目是什么、成绩怎么算、评测收下什么样的答案,写在材料"任务与本轮"的"任务要点"和任务说明全文里。 + +这份研究要两样东西:更高的分数,和"为什么更高"的知识。两样由不同的步骤负责。正向实验只管分数:写入口、提改法时,选你认为最可能拿到最高分的那条路,哪怕它要换掉整道工序、结果难以预料。冲失败了,基线不会倒退——候选只有比基线好过采纳线才成为新基线——只是用掉一次运行,失败本身也记进研究记录,同样是信息。"为什么"由后面的消融和解释负责:被采纳的改法会被逐个关掉因子重跑,拆出每一处撑了几成。所以提方向时不必先挑一条稳当、好解释的小步,也不必为了以后好拆而放弃分数更高的路。 + +估分是另一回事:给三个数时照你的真实判断写,激进的方案不往高里报,稳当的方案也不往低里压。程序靠这些数决定跑谁,报偏了,选出来的就不是大家真正看好的。 + +你交的每样东西,后面都会有人拿来对照实测。 ## 一份研究怎么走 diff --git a/prompts/tasks/claim.md b/prompts/tasks/claim.md index 56032c5..5733d25 100644 --- a/prompts/tasks/claim.md +++ b/prompts/tasks/claim.md @@ -1,6 +1,6 @@ # 第零轮:认领入口 -入口已经定了最后一版,讨论也结束了(材料"本任务要处理的东西"里有全部人的最终入口清单和全部讨论)。现在请你按想走的先后,把入口编号排成一串志愿。可以排别人写的入口:讨论里有人说某条路没人站、而你愿意走,就把它排前面。 +入口已经定了最后一版,讨论也结束了(材料"本任务要处理的东西"里有全部人的最终入口清单和全部讨论)。现在请你按想走的先后,把入口编号排成一串志愿。排的时候想:哪个入口走下去最可能拿到最高分,你又最能把它走到底。可以排别人写的入口:讨论里有人说某条路没人站、而你愿意走,就把它排前面。 讨论原文里写的是当时的编号。有人在讨论里整份换过入口,他的旧编号已经作废,材料末尾"入口编号对照"里标着;志愿只能写最后一版里的编号。 diff --git a/prompts/tasks/discussion.md b/prompts/tasks/discussion.md index 41a842d..55e5a89 100644 --- a/prompts/tasks/discussion.md +++ b/prompts/tasks/discussion.md @@ -2,11 +2,13 @@ 全部人的入口都摆出来了(材料"本任务要处理的东西"里,标明作者;之前已经有过讨论的,讨论全文也在那里)。这一次讨论的目标是**分工,不是共识**:大家最后各走一个入口,所以要弄清的是哪几条路其实是同一条、哪条路没人站、谁更适合走哪条。不需要大家同意哪个入口最好——现在争出一个"最好的入口",大家反而会都挤到同一条路上。 +第 1 轮是冲分的一轮(系统提示词开头讲了正向实验只管分数)。分工按"顺着它走到底,会成为哪一种完整的解法"来分,不按基线代码的几道工序来分:几个人各管程序里的一道工序,第 1 轮就没有一条从头走到底的路。也不必先安排一个人去做最稳当、最好测的那一步再说;那一步要是有用,可以作为配套放进冲分的路里。 + 可以顺着这几个问题想,不必按顺序写,也不必每个都答: - 哪些入口其实是同一条路?两个入口最后会读同一段代码、问同一个问题,就建议合并,或者其中一位换一个。 - 把全部入口按"顺着它走下去,最后会做成哪一类改动"归一归类:哪几类有好几个人站,有没有一整类做法没人站?有没有哪个设定,所有入口都默认它不动? -- 哪条路如果走对了收益最大?说出你的判断和依据;它不决定谁走哪条,但能帮大家看清哪条路空着最可惜。 +- 哪条路走到底最可能拿到最高分?只改程序里某一道工序的路,单独走到底能到哪?说出你的判断和依据;它不决定谁走哪条,但能帮大家看清哪条路空着最可惜。 - 你自己更想走哪条,为什么——你在那条路上能看到什么别人看不到的东西? 别人的入口可以评,说清你觉得它和哪个入口重叠,或者为什么它看不到它想看的东西;但不用替别人改写入口,也不用说服谁放弃。你的看法和别人不同,照实写。 diff --git a/prompts/tasks/entry.md b/prompts/tasks/entry.md index d3e7945..78a4453 100644 --- a/prompts/tasks/entry.md +++ b/prompts/tasks/entry.md @@ -4,37 +4,43 @@ 先闭门写,是因为几位研究者是同一个模型、读同一份材料:一上来就一起想,几个人会想到同一处去。 -### 先看题,再看基线 +入口为第 1 轮冲分服务(系统提示词开头讲了正向实验只管分数)。好入口的标准是:顺着它走下去,最可能拿到最高分;不是哪条最稳当、最好测。 -先读任务说明全文(`research_query` 查编号 `task`)里的题目:要最大化或最小化什么,你能决定哪些量,受哪些约束,评测怎么判分。然后再读基线代码。基线只是这道题的一种做法,不是题目本身:它把题目拆成了哪几步、每一步怎么做,都只是它自己的选择。 +### 按这个顺序想 + +**第一步,先不看基线代码,自己解这道题。** 读任务说明全文(`research_query` 查编号 `task`):要最大化或最小化什么,你能决定哪些量,受哪些约束,评测怎么判分,时间和机器有什么限制。然后,在用 `read_source` 读基线之前,假设这份程序不存在:要是从零写,你会怎么解?在思考里列出你会考虑的几种解法,每种一两句话——从哪里起步、怎么把答案一步步改好、最后怎样保证评测收下——再判断哪一种你认为最可能拿到最高分、为什么。这份清单不用交,写在思考里就行。 + +**第二步,再读基线,把它拆成工序。** 用 `read_source` 读基线代码,拆成一道道工序:每道工序做什么、决定了答案的哪一部分、用的是哪一类做法;哪些设定是它自己定死的,题目并没有要求。基线只是这道题的一种做法,它怎么拆、每道怎么做,都只是它自己的选择。 + +**第三步,把两边对起来。** 拿第一步你认为最好的解法,和基线的工序逐道对照:哪几道工序在你的解法里根本不存在,或者做法完全不同;基线的毛病里,哪些修好了也只是在它这一类做法里改进,哪些要换成另一种解法才会消失。基线里显眼的毛病,几位研究者读同一份代码几乎一定都会看到;它们值得有人管,但不必占满你的清单,也可以作为配套放进一条冲分的路里。 ### 入口是什么 入口是**起点,不是结论**。它说的是"从哪里开始看",起点可以落在三类地方: -- **基线的一段代码**:先读哪一段,先问它什么问题。 - **题目本身**:目标、能决定的量、约束之间是什么关系;有没有哪个设定是题目并没有要求、只是被默认定死了的。 - **做法的类别**:这一类问题通常有哪几类做法,基线属于哪一类,别的类别会从哪里入手。 +- **基线的一段代码**:先读哪一段,先问它什么问题。 入口不写"应该改成什么""能到多少分"——那是看完以后才知道的事,写进入口,就替还没开始的研究下了结论。 下面的例子都来自另一道题(把一批任务排到几台机器上、让全部做完的时间最短的调度程序),只示范入口的写法,内容和你的题目无关,不要照搬: -- 从一段代码起步:"先读挑下一个任务的那段:它每次只看眼前最空的机器,先问任务长短差别很大时,这种一步一步的排法会把哪类任务排坏。" - 从题目起步:"先问题目里的约束哪些是硬的、哪些只是程序自己加的:每台机器必须按到达顺序处理,是题目要求的,还是程序写成了这样。" - 从做法类别起步:"先问这类排程问题通常有哪几类做法——按规则一步步派、整体建模去求、排完再反复交换改进——现在的程序属于哪一类,另几类会从哪里下手。" +- 从一段代码起步:"先读挑下一个任务的那段:它每次只看眼前最空的机器,先问任务长短差别很大时,这种一步一步的排法会把哪类任务排坏。" - 坏:"把排法改成先排长任务,能缩短 20%。"——这是一条提案,而且替还没开始的研究下了结论。 - 坏:"优化调度。"——太空,读的人不知道要先弄清什么问题。 -### 怎么想出入口 +### 挑出两三个 -先在思考里列出六到八个可能的起点,只写名字就够,上面三类都想一想。然后看一眼:它们是不是都落在同一类上?最常见的情形是全都落在基线代码里那几处显眼的毛病上。同一个模型读同一份基线,最先看到的总是那几处,几位研究者几乎一定都会写;它们值得有人站,但不必占满你的清单。都落在同一类时,换一类再想一两个。 +把三步里冒出来的起点在思考里列成一串,六到八个,只写名字就够。看一眼:它们是不是都落在同一类上?最常见的情形是全都落在基线代码里那几处显眼的毛病上。都落在同一类时,换一类再想一两个。 -最后从里面挑两到三个你自己真觉得值得走的交上来。不用为了跟别人不同去写一个你并不看好的方向:没人真想走的入口,分到手里只会走成一条凑数的路。 +最后挑两到三个你真觉得最可能通向最高分的交上来。第一步你认为最好的那种解法,通常应当有一个入口通向它;没有的话,想清楚为什么。不用为了跟别人不同去写一个你并不看好的方向:没人真想走的入口,分到手里只会走成一条凑数的路。 ### 每个入口写什么 - 名称:离开这份清单单独看也读得懂。 -- 正文:从哪里开始看;为什么值得有人走——这条路可能找到什么,它和你另外几个入口有什么不同。 +- 正文:从哪里开始看;为什么值得有人走——这条路走到底,能比基线这一类做法走得更远还是只在它里面改进,理由是什么(不写数);它和你另外几个入口有什么不同。 两个入口如果最后会读同一段代码、问同一个问题,它们其实是一条路,只留一个。想不到第三个就交两个,不凑。下一步大家会读到全部人的入口(标明作者),讨论分工。 diff --git a/prompts/tasks/explanation.md b/prompts/tasks/explanation.md index 7431e8a..e9f6141 100644 --- a/prompts/tasks/explanation.md +++ b/prompts/tasks/explanation.md @@ -6,7 +6,7 @@ ### 一条解释是什么 -一条解释就是一段话:你认为分数主要是哪个因子挣来的,靠的是什么道理,在什么情况下这个道理会失效。如果你认为某个因子要靠另一个因子才起作用——比如"没有随机挪动,多起点重启就几乎没用"——也写进来,这正是一条能被检验的预测。 +一条解释就是一段话:你认为分数主要是哪个因子挣来的,靠的是什么道理,在什么情况下这个道理会失效。如果你认为某个因子要靠另一个因子才起作用——比如"没有预取,换淘汰策略就几乎没用"——也写进来,这正是一条能被检验的预测。 然后把这段话翻成数:对每一格,写"关掉这个因子以后,最终指标大概落在哪",给一成、一半、九成三个数,按最终指标的原值写。想的时候不需要推代码,只问自己:这个因子撑了总提升的几成——几乎没有、一小部分、一大半,还是几乎全部?撑得多,关掉后就靠近基线;撑得少,就靠近完整代码的分数。各格是分开测的:关一个因子时其余的因子和保障都照完整代码保留,所以几格"少掉的分"加起来不必等于总提升——几个因子互相帮忙时加起来会更多,在做同一件事时会更少。拿不准就放宽,宽到把你犹豫的几种情形都包进去;但也别宽到什么结果都包得住,那样的范围跑完以后什么也说明不了。 diff --git a/prompts/tasks/proposal.md b/prompts/tasks/proposal.md index c15b5b1..889adcf 100644 --- a/prompts/tasks/proposal.md +++ b/prompts/tasks/proposal.md @@ -2,9 +2,15 @@ 这一轮,你和另外几位研究者各自提出改法。你交的每一条,接下来要经过几个人的手:别的研究者读它、挑毛病、估它能跑多少分;实验员照着它写代码;跑完以后,大家拿结果回头对照它。一条好提案的标准很朴素:别人不用来问你,就能看懂你要改什么、为什么觉得有用、什么结果算你错了。 +## 冲最高分 + +正向实验只管分数(系统提示词开头讲了为什么):在你想得到的改法里,交你认为最可能拿到最高分的那条,哪怕它要换掉整道工序、结果难以预料。只修一处、结果几乎能事先算出来的小步,跑完多半只确认了你已经知道的东西;它要是值得做,就作为配套放进冲分的那条里。冲分不等于捆:路可以走得很远,因子照样要拆得开(见下面"两种会让结论变成假的做法")。 + ## 从哪里出发 -先读"你自己的"一节:你认领的入口、你的笔记、你自己候选的结果。第 1 轮时入口是你的起点,从它说的那段代码、那个问题开始看;看完觉得别处更值得改,就提别处。第 2 轮起,走不走入口由你定。 +先读"你自己的"一节:你认领的入口、你的笔记、你自己候选的结果。第 1 轮时入口是你的起点,从它说的那个问题开始看;看完觉得别处更值得改,就提别处。第 2 轮起,走不走入口由你定。 + +第 1 轮还没有任何实测。先在思考里做一遍写入口时的那三步,这次落在你认领的入口上:不看基线,要是从零写你会怎么解、哪种最可能拿最高分;再把基线拆成工序;最后对照,看哪几道工序要换掉、哪几道留着。 再读公共材料。"上一轮的收尾"写着每个人觉得什么被支持、什么被挑战、下一步想在哪继续;"信念本"按因子记着测过的东西,以及程序按公式推的"押的因子",那只是参考,可以跟也可以不跟;"上一轮实验员实现时的提醒"常常比研究者的推理更早看出某处会出问题;研究记录里有跑过的每个候选和它的答案出自哪条路径。 @@ -48,6 +54,6 @@ ## 交几条 -本轮你可以交一到 M 条(M 写在材料"任务与本轮"里),一条就很好。一条一条地交;交第二条之前,想清楚它和前面那条在机制上差在哪。宁可交一条你真心觉得值得一跑、写得清楚的,也不要为了交满而补一条自己都说不清的:它会占掉一次正式运行,跑完还说明不了什么。 +本轮你可以交一到 M 条(M 写在材料"任务与本轮"里)。一条一条地交;交第二条之前,想清楚它和前面那条在机制上差在哪。宁可交一条你真心看好、写得清楚的,也不要为了交满而补一条你自己都不看好的。 一条都找不到时,就不交,在回复里写清卡在哪:缺什么信息,试过哪些方向、为什么放弃。用户会读到你写的原因。