为什么Gemini API在接收到新提示时还会返回旧提示的结果?

我使用Flask创建了一个Web应用程序,可以选择特定文本并使用Gemini API进行改写。改写功能正常工作,但假设我首先请求它改写字符串A,并且它成功完成了。现在,当我请求它改写字符串B时,它返回了改写结果(字符串A + 字符串B),这是我不想要的。

我使用JavaScript按钮获取当前选中的文本

var selectedText = window.getSelection().toString();

并将其发送到Flask,Flask中的实现代码如下

@app.route('/paraphrase', methods=['POST'])def paraphrase():    genai.configure(api_key=API_KEY)    try:        text = request.get_json().get('text')        contents_ = contents.copy()        #contents_[0]['parts'].append({'text': text})        contents_[0]['parts'].append({'text': ' '})        contents_[0]['parts'][-1]['text'] = "paraphrase : " + text        gemini = genai.GenerativeModel(model_name=model)        response = gemini.generate_content(            contents_,            generation_config=generation_config,            safety_settings=safety_settings,            stream=False)        return response.candidates[0].content.parts[0].text    except:        return text

这里的’contents’包含了初始提示

contents = [{'parts': [{'text': 'Your job is to paraphrase the given texts into easier language. Also remove any spelling and grammar mistakes if you find one. You will be given input in form of paraphrase: {text}, and your output should only contain the paraphrased text, no other text, not a thing unrelated'}]}]

如您所见,从Flask代码中,我尝试在每次API调用开始时创建’contents’的副本,尝试删除’contents_’变量,最后尝试替换文本,但没有任何变化。它仍然会给出所有先前调用的文本以及新文本的改写结果。


回答:

听起来copy()函数是创建了一个浅拷贝。因此,虽然它创建了一个新列表,但该列表的所有成员都是原始列表中的相同成员。它没有对它们进行复制。

因此,当您创建contents_时,content中的字典是同一个字典。然后当您向其中添加内容时——您实际上是在向两者都添加内容。(这对于数组也是成立的。)

您需要一个创建深拷贝而不是浅拷贝的版本。您可以从copy模块的deepcopy()函数中获得这个功能。因此,您可以这样做

import copy...contents_ = copy.deepcopy(contents)

这样contents_将获得contents的一个干净的、深层次的副本,而对contents_的后续更改不会影响原始内容。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注