Skip to content

Commit 90d2c03

Browse files
committed
fix:提示词里加入例子优化指令跟随效果
1 parent fce44da commit 90d2c03

File tree

1 file changed

+226
-88
lines changed

1 file changed

+226
-88
lines changed

src/cvbManager.ts

Lines changed: 226 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,32 @@ export class Cvb {
138138
CVB 格式介绍:
139139
- 文件以 "## BEGIN_CVB" 开头,以 "## END_CVB" 结尾。
140140
- 元数据部分以 "## META" 开头,以 "## END_META" 结尾,包含用户需求和时间戳。
141-
- 每个文件以 "## FILE:文件路径" 开头,紧接着是 Markdown 格式的代码块,包含文件内容
141+
- 每个文件以 "## FILE:文件路径" 开头,紧接着是 Markdown 格式的代码块,也就是一定要用 \`\`\` 包裹文件内容
142142
- 多个文件按顺序拼接在一起。
143+
- 所有 ## 开头的指令提示符前面都不能有空格,必须在行首
144+
例子:
145+
## BEGIN_CVB
146+
## META
147+
需求: 代码重构
148+
时间戳: 2025-02-26 12:34:56
149+
## END_META
150+
151+
## FILE: /src/main.cpp
152+
\`\`\`c++
153+
#include <iostream>
154+
int main() {
155+
std::cout << "Hello, world!" << std::endl;
156+
return 0;
157+
}
158+
\`\`\`
159+
## FILE: /src/utils.cpp
160+
\`\`\`c++
161+
#include <cmath>
162+
double add(double a, double b) {
163+
return a + b;
164+
}
165+
\`\`\`
166+
## END_CVB
143167
`;
144168
}
145169
}
@@ -414,44 +438,158 @@ export class TCVB {
414438
return `
415439
TCVB 格式规范:
416440
417-
## BEGIN_TCVB
418-
[文件块1]
419-
[文件块2]
420-
...
421-
## END_TCVB
441+
## BEGIN_TCVB
442+
[文件块1]
443+
[文件块2]
444+
...
445+
## END_TCVB
422446
423-
文件块格式:
424-
## FILE:<文件绝对路径>
425-
[操作1]
426-
[操作2]
427-
...
447+
文件块格式:
448+
## FILE:<文件绝对路径>
449+
[操作1]
450+
[操作2]
451+
...
428452
429453
操作类型:
430454
431-
1. 全局替换操作(GLOBAL-REPLACE):
432-
## OPERATION:GLOBAL-REPLACE
433-
## OLD_CONTENT
434-
[markdown代码块:被全局替换的内容, 可以在需要被替换的文本前后包含一些上下文帮助精确替换,一般是上下各3行。不要太长,不要带太多不必要的上下文,因为输出越长就越可能出错导致匹配不上。总长度不要超过10行,尽量不要大块的替换代码,而是切成很多小块替换。]
435-
## NEW_CONTENT
436-
[markdown代码块:新内容]
455+
1. **全局替换操作(GLOBAL-REPLACE)**:
456+
- 适用于需要在文件中替换某一段内容的情况。
457+
- 提供被替换的旧内容(OLD_CONTENT)和新的替换内容(NEW_CONTENT)。
458+
- 内容应尽量保持简洁,避免过长的上下文。上下文一般保留前后3行,可以根据需要增加,但总长度不要超过10行,避免出错。
459+
- 替换操作中的内容需要完整包含在三个反引号(\`\`\`)包裹的代码块中。
460+
461+
示例:
462+
## OPERATION:GLOBAL-REPLACE
463+
## OLD_CONTENT
464+
\`\`\`
465+
#include <iostream>
466+
int main() {
467+
std::cout << "Hello, world!" << std::endl;
468+
return 0;
469+
}
470+
\`\`\`
471+
## NEW_CONTENT
472+
\`\`\`
473+
#include <iostream>
474+
int main() {
475+
std::cout << "Welcome to TCVB format!" << std::endl;
476+
return 0;
477+
}
478+
\`\`\`
479+
480+
- **操作说明**:
481+
- **OLD_CONTENT**:包含旧代码,通常保留必要的上下文。
482+
- **NEW_CONTENT**:包含新代码,将替换掉旧内容。
483+
- **重要提示**:尽量避免长段内容的替换,细化为多个小块进行替换。不要丢失注释、空行等结构信息。
484+
485+
2. **创建操作(CREATE)**:
486+
- 创建一个新文件,后面直接给全文代码。
487+
- 新文件的全部内容应完整写入代码块中。
488+
- 如果文件已经存在,应该有GLOBAL-REPLACE来插入,而不是用CREATE
489+
490+
示例:
491+
## OPERATION:CREATE
492+
\`\`\`
493+
#include <cmath>
494+
double add(double a, double b) {
495+
return a + b;
496+
}
497+
\`\`\`
498+
499+
- **操作说明**:
500+
- 该操作用于新文件的创建或新增代码块。
501+
- 新的代码必须以 Markdown 格式代码块包裹。
502+
- 如果在已有文件中插入大块代码,应该使用替换操作,而不是 CREATE 操作。
503+
504+
### 省略标识符规则:
505+
506+
3. **省略标识符(//...CCVB)**:
507+
- \`//...CCVB\` 是一个省略标识符,表示代码的某一部分过长或不需要显示,已被省略或删除。
508+
- **注意**:省略标识符 **不能** 出现在被替换的内容中。
509+
- 如果某段代码包含省略标识符 \`//...CCVB\`,则不能将该标识符的行当作替换操作的锚点的一部分。
510+
- 被替换的内容必须位于 \`//...CCVB\` 标识符的上下方,不能跨越该标识符。
511+
512+
示例:
513+
假设以下代码中有一段被省略:
514+
\`\`\`cpp
515+
// Some initial setup code...
516+
//...CCVB
517+
// Remaining logic code...
518+
\`\`\`
519+
520+
在进行全局替换操作时,不能选择跨越 \`//...CCVB\` 标识符的范围。例如:
521+
错误的替换示例(跨越省略标识符):
522+
"
523+
## OPERATION:GLOBAL-REPLACE
524+
## OLD_CONTENT
525+
\`\`\`
526+
// Some initial setup code...
527+
//...CCVB
528+
// Remaining logic code...
529+
\`\`\`
530+
"
531+
532+
正确的替换示例(避免跨越省略标识符):
533+
"
534+
## OPERATION:GLOBAL-REPLACE
535+
## OLD_CONTENT
536+
\`\`\`
537+
// Some initial setup code...
538+
\`\`\`
539+
## NEW_CONTENT
540+
\`\`\`
541+
// New code after the initial setup
542+
\`\`\`
543+
"
544+
545+
### 注意:
546+
1. 所有 OPERATION 操作以行为单位。
547+
2. 一个 '## FILE' 下可以有多个 '## OPERATION'。
548+
3. 锚点为连续的多行内容:使用至少3行唯一文本作为锚点,用来标定范围,防止混淆(如果需要可以超过3行)。
549+
4. [markdown代码块] 一定要用 \`\`\` ... \`\`\` 包裹,仔细检查不要漏掉。
550+
5. 注意 TCVB 和 CVB 的区别。CVB 是完整的内容,而 TCVB 是用来生成差量同步的,通过多个 OPERATION 去操作已有 CVB 合成新 CVB。
551+
6. 插入和删除操作都可以转化为替换操作。
552+
7. 用来匹配的锚点必须和原文的格式完全一致,不能有缺失,不能丢弃注释。
553+
8. 注意不要丢失 OPERATION 而直接输出代码块。
554+
9. 不要私自加入不必要的空行。
555+
10. 如果是在一个已有文件里插入大块代码,不应该用 CREATE,而是用替换的方式插入。
556+
11. 所有## 开头的提示符前面都不能有空格,要在行首
557+
558+
示例:
559+
## BEGIN_TCVB
560+
561+
## FILE:/src/main.cpp
562+
## OPERATION:GLOBAL-REPLACE
563+
## OLD_CONTENT
564+
\`\`\`
565+
#include <iostream>
566+
int main() {
567+
std::cout << "Hello, world!" << std::endl;
568+
return 0;
569+
}
570+
\`\`\`
571+
## NEW_CONTENT
572+
\`\`\`
573+
#include <iostream>
574+
int main() {
575+
std::cout << "Welcome to TCVB format!" << std::endl;
576+
return 0;
577+
}
578+
\`\`\`
579+
580+
## FILE:/src/utils.cpp
581+
## OPERATION:CREATE
582+
\`\`\`
583+
#include <cmath>
584+
double add(double a, double b) {
585+
return a + b;
586+
}
587+
\`\`\`
437588
438-
2. 创建操作(CREATE):
439-
## OPERATION:CREATE
440-
[markdown代码块:直接跟正文内容,表示新文件的全部内容]
589+
## END_TCVB
590+
`;
591+
}
441592

442-
注意:
443-
1. 所有OPERATION操作以行为单位
444-
2. 一个'## FILE'下可以有多个'## OPERATION'
445-
3. 锚点为连续的多行内容:使用至少3行唯一文本作为锚点,用来标定范围,防止混淆(如果需要可以超过3行)
446-
4. [markdown代码块], 一定要用\`\`\` ... \`\`\` 包裹,仔细检查不要漏掉。
447-
5. 注意TCVB和CVB的区别。CVB是完整的内容,而TCVB是用来生成差量同步的,通过多个OPERATION去操作已有CVB合成新CVB
448-
6. 插入和删除操作都可以转化为替换操作
449-
7. 用来匹配的锚点必须和原文的格式完全一致,不能有缺失,不能丢弃注释。
450-
8. 注意不要丢失OPERATION而直接输出代码块
451-
9. 不要私自加入不必要的空行
452-
10.如果是在一个已有文件里插入大块代码,不应该用CREATE,而是用替换的方式插入
453-
`;
454-
}
455593
}
456594

457595
// ================== 合并函数 ==================
@@ -707,61 +845,61 @@ export async function compressCvb(cvb: Cvb, userRequest: string): Promise<Cvb> {
707845
for (const [filePath, fileContent] of Object.entries(files)) {
708846
// 构造 API 请求内容
709847
const requestContent = `
710-
文件路径: ${filePath}
711-
712-
文件内容:
713-
\`\`\`
714-
${fileContent}
715-
\`\`\`
716-
717-
用户请求:
718-
\`\`\`
719-
${userRequest}
720-
\`\`\`
721-
722-
请从文件内容中识别并提取出有价值的代码片段,这些片段对理解代码在用户请求中的上下文非常重要。你需要关注以下几点:
723-
1. 提取出关键信息的代码块,这些代码块帮助理解用户请求中的核心上下文。比如在重构任务中,需要关注相关的函数、变量及其上下级调用等。
724-
2. 需要被处理的内容(如重构代码),应该被提取出来。
725-
3. 确定有必要作为“锚点”的代码段,以便后续处理时可以方便地替换。
726-
727-
例如:
728-
假设给定代码如下:
729-
\`\`\`
730-
function func1() {
731-
// 代码块1
732-
}
733-
734-
function func2() {
735-
// 代码块2
736-
}
737-
738-
function func3() {
739-
// 代码块3
740-
}
741-
\`\`\`
742-
743-
用户请求关注 \`func1\` 和 \`func2\`,并希望忽略 \`func3\`。你应该返回如下结果:
744-
745-
\`\`\`
746-
function func1() {
747-
// 代码块1
748-
}
749-
===SEGMENT===
750-
function func2() {
751-
// 代码块2
752-
}
753-
\`\`\`
754-
755-
注意:
756-
1. 只保留 \`func1\` 和 \`func2\`,并通过 \`===SEGMENT===\` 分隔。
757-
2. \`func3\` 被丢弃,**但其位置仍然被正确地分隔开**,以确保后续的处理不会出现问题。
758-
3. 例子里的 \`\`\` 只是为了便于说明格式清楚,你输出的时候不要有 \`\`\` 包裹代码
759-
760-
返回时,请确保**每个代码片段**都保持原始结构,不要有任何多余的文字,并且使用 \`===SEGMENT===\` 来分隔它们,而不是使用 \`\`\`code\`\`\` 或其他分隔符。
761-
762-
确保返回的格式是干净且可解析的,只包括代码片段和分隔符,不要包含任何额外的解释或注释信息!
763-
764-
`;
848+
文件路径: ${filePath}
849+
850+
文件内容:
851+
\`\`\`
852+
${fileContent}
853+
\`\`\`
854+
855+
用户请求:
856+
\`\`\`
857+
${userRequest}
858+
\`\`\`
859+
860+
请从文件内容中识别并提取出有价值的代码片段,这些片段对理解代码在用户请求中的上下文非常重要。你需要关注以下几点:
861+
1. 提取出关键信息的代码块,这些代码块帮助理解用户请求中的核心上下文。比如在重构任务中,需要关注相关的函数、变量及其上下级调用等。
862+
2. 需要被处理的内容(如重构代码),应该被提取出来。
863+
3. 确定有必要作为“锚点”的代码段,以便后续处理时可以方便地替换。
864+
865+
例如:
866+
假设给定代码如下:
867+
\`\`\`
868+
function func1() {
869+
// 代码块1
870+
}
871+
872+
function func2() {
873+
// 代码块2
874+
}
875+
876+
function func3() {
877+
// 代码块3
878+
}
879+
\`\`\`
880+
881+
用户请求关注 \`func1\` 和 \`func2\`,并希望忽略 \`func3\`。你应该返回如下结果:
882+
883+
\`\`\`
884+
function func1() {
885+
// 代码块1
886+
}
887+
===SEGMENT===
888+
function func2() {
889+
// 代码块2
890+
}
891+
\`\`\`
892+
893+
注意:
894+
1. 只保留 \`func1\` 和 \`func2\`,并通过 \`===SEGMENT===\` 分隔。
895+
2. \`func3\` 被丢弃,**但其位置仍然被正确地分隔开**,以确保后续的处理不会出现问题。
896+
3. 例子里的 \`\`\` 只是为了便于说明格式清楚,你输出的时候不要有 \`\`\` 包裹代码
897+
898+
返回时,请确保**每个代码片段**都保持原始结构,不要有任何多余的文字,并且使用 \`===SEGMENT===\` 来分隔它们,而不是使用 \`\`\`code\`\`\` 或其他分隔符。
899+
900+
确保返回的格式是干净且可解析的,只包括代码片段和分隔符,不要包含任何额外的解释或注释信息!
901+
902+
`;
765903

766904
// 系统提示
767905
const systemContent = "你是一个代码分析助手。给定一个文件的内容和用户的请求,识别并提取出对理解代码在请求上下文中的有价值的代码片段。注意输出的时候不要有 \`\`\`";

0 commit comments

Comments
 (0)