fishjar / kiss-translator

A simple, open source bilingual translation extension & Greasemonkey script (一个简约、开源的 双语对照翻译扩展 & 油猴脚本)
https://github.com/fishjar/kiss-translator
GNU General Public License v3.0
2.43k stars 92 forks source link

openai prompt增强建议 #141

Open utopeadia opened 1 month ago

utopeadia commented 1 month ago

原Prompt作为systemPrompt,引入userPrompt进行强约束(可以参考沉浸式翻译) 参考修改逻辑: 1、界面修改为systemPrompt和userPrompt 2、openai默认配置设置为:

const defaultOpenaiApi = {
  url: "https://api.openai.com/v1/chat/completions",
  key: "", 
  model: "gpt-4",
  systemPrompt: `You will be provided with a sentence in ${INPUT_PLACE_FROM}, and your task is to translate it into ${INPUT_PLACE_TO}.`,
  prompt: `Translate the following source text to ${INPUT_PLACE_TO}, Output translation directly without any additional text.\nSource Text: ${INPUT_TEXT}\nTranslated Text:`,
  temperature: 0,
  maxTokens: 256,
  fetchLimit: 1,
  fetchInterval: 500,
};

3、请求更改为:

const genOpenAI = ({
    text,
    from,
    to,
    url,
    key,
    prompt,
    model,
    temperature,
    maxTokens,
}) => {
    systemPrompt = systemPrompt
        .replaceAll(INPUT_PLACE_FROM, from)
        .replaceAll(INPUT_PLACE_TO, to);

    prompt = prompt
        .replaceAll(INPUT_PLACE_TO, to)
        .replaceAll(INPUT_TEXT, text);

    const data = {
        model,
        messages: [
            {
                role: "system",
                content: systemPrompt,
            },
            {
                role: "user",
                content: prompt,
            },
        ],
        temperature,
        max_tokens: maxTokens,
    };

    const init = {
        headers: {
            "Content-type": "application/json",
            Authorization: `Bearer ${key}`, // OpenAI
            "api-key": key, // Azure OpenAI
        },
        method: "POST",
        body: JSON.stringify(data),
    };

    return [url, init];
};
fishjar commented 1 month ago

我不确定这样的prompt是否翻译效果更好,但消耗的token是明显更多了。 不过后面可以参考你这样的写法,更灵活些,把选择权交给用户。

utopeadia commented 1 month ago

我不确定这样的prompt是否翻译效果更好,但消耗的token是明显更多了。 不过后面可以参考你这样的写法,更灵活些,把选择权交给用户。

目前沉浸式翻译使用的是这样的,我实际体验下来这样加入约束会明显降低llm对输入进行“回答”或者“解释”的概率,更专注于翻译任务本身,测试方法也很简单,测试一些像是提问的输入即可,对于中小型模型这样做效果相当明显

utopeadia commented 2 weeks ago

我不确定这样的prompt是否翻译效果更好,但消耗的token是明显更多了。 不过后面可以参考你这样的写法,更灵活些,把选择权交给用户。

这一段时间我和身边的人(共5人)使用pot结合低水平模型(包括但不限于gpt3.5\qwen7B\yi-1.5-9B\spark lite\文心speed8K\gemini1.5flash)进行了不同提示词结论测试,在长文本描述性文档翻译测试中,两者表现相似;在存在疑似问题的长句中,5人主观评分双提示词约束强于单提示词约束约30%;小短句中,双提示词约束远远强于单提示词约束,双提示词约束几乎没有或者很少出现回答问题和进行解释的情况,单提示词约束极易出现答疑和解释。 在规模较小模型价格降低甚至免费的当下,我认为牺牲一部分token获得更好的结果是值得的。当然最好还是有用户选择的方法,pot就选择了交给用户,除了内置之外,用户可以自行补充system prompt和user prompt。 image