借助 LLM 实现默认值自定义函数编写自由

分享 AiLLM  收藏
4 / 223

先上 prompt

作为一个精通 JavaScript 的软件开发者,你的挑战是编写一段指定功能的代码片段。

你要编写的代码是一个函数体部分,即不包含最外层的 function fn_name {}。
所有需要使用的变量都会在代码执行时替换成真实值,你需要在最开始定义这些变量,例如 var date = $日期$;。

示例
INPUT:
实现从日期字段中提取年份的函数
OUTPUT:
```
var date = $日期$;
const dateObj = new Date(date);
return dateObj.getFullYear();
```

RULES:
返回的是一个可以放到 new Function 参数内执行的函数体。
函数的运行环境是一个沙盒,所以你不可以使用任何类库,所有的代码都是原生实现。
返回的代码要保证可执行,不要返回伪代码,不要出现未定义的函数。
DO NOT USE TEMPLATE LITERALS.
函数体最后一定要 return 结果!

你的挑战是编写一段指定功能的代码片段

上面的只是例子,下面我会给你真实的任务,理解了请回复 OK

结果返回格式如下:
函数体代码

把这段 prompt 作为内容发送到对话,后面就可以发送具体要求了。在 ChatGPT 3.5 和通义千问下测试都取得了不错的效果,生成的代码把顶部定义的变量替换成真实字段就能直接跑起来了。

文心一言,星火大模型,智谱清言均无法理解 prompt,表现结果甚至不如开源模型 Yi-34B-Chat。Yi-34B-Chat 虽然回答的代码一直有 bug,但是它理解了指令。

回答结果不满意时可以发送修改要求让它继续调整。对话回合较多后大模型可能会忘记它要做什么(通义千问记性不行,忘的很快),当它开始胡言乱语时再发一次 prompt 就好。

可能的问题:
函数使用模板字符串,模板字符串出现了成对的 $ 导致函数编辑器识别成了字段变量。解决方法是回复『不要使用模板字符串』。
有一定的几率出现函数体最后没有 return 结果,这时回复 『需要 return 结果』。
返回的代码定义变量时加了引号,比如 var date = '$日期$'; 替换成字段时记得不要保留引号。

一些 ChatGPT3.5 的回复:
生成唯一编号,由数字和大写字母组成,日期开头

function generateUniqueCode() {
  var date = new Date();
  var year = date.getFullYear().toString().slice(-2);
  var month = (date.getMonth() + 1).toString().padStart(2, '0');
  var day = date.getDate().toString().padStart(2, '0');
  var characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  var codeLength = 8;
  var uniqueCode = year + month + day;
  for (var i = 0; i < codeLength; i++) {
    var randomIndex = Math.floor(Math.random() * characters.length);
    uniqueCode += characters.charAt(randomIndex);
  }
  return uniqueCode;
}
var uniqueCode = generateUniqueCode();
return uniqueCode;

从一段文字提取中国大陆手机号邮箱换行分隔返回

var text = $文本$;
function extractPhoneAndEmail(text) {
  var phoneRegex = /1[3456789]\d{9}/g;
  var emailRegex = /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g;
  var phones = text.match(phoneRegex) || [];
  var emails = text.match(emailRegex) || [];
  var result = phones.concat(emails).join('\n');
  return result;
}
return extractPhoneAndEmail(text);

把小数转换成分数,需要化简到最简

var decimal = $小数$;
function gcd(a, b) {
  if (b === 0) {
    return a;
  } else {
    return gcd(b, a % b);
  }
}
function decimalToFraction(decimal) {
  var numerator = decimal;
  var denominator = 1;
  while (numerator % 1 !== 0) {
    numerator *= 10;
    denominator *= 10;
  }
  var divisor = gcd(numerator, denominator);
  numerator /= divisor;
  denominator /= divisor;
  return numerator + '/' + denominator;
}
return decimalToFraction(decimal);

输入 prompt 试试吧!