所以我使用 Flask 制作了一个 Web 应用程序,我可以在其中选择某些文本并使用 Gemini API 来解释它。 然而,释义工作正常,假设我要求它首先释义字符串 A 并且它成功地做到了。现在,当我要求它解释字符串 B 时,它返回解释的结果(字符串 A + 字符串 B),这是我不想要的。
我使用 javascript 按钮获取当前选定的文本
var selectedText = window.getSelection().toString();
并发送给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 = [{'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_”变量,最后尝试替换文本,但没有任何变化。 它仍然提供所有先前调用的文本以及新文本的释义文本。
听起来就像copy()
函数正在制作列表的浅表副本。因此,当它创建一个新列表时,该列表的所有成员都与原始列表中的成员相同。它没有复制它们。所以当你创建
contents_
时,
content
中的字典是同一个字典。然后当你添加到它时 - 你同时添加到它们两个。 (对于数组也是如此。)您需要一个可以进行深复制而不是浅复制的复制版本。您可以从
deepcopy()
模块中的
copy
函数获取此信息。所以你可以做
import copy
...
contents_ = copy.deepcopy(contents)
和 contents_
将获得
contents
的干净、深入的副本,而无需对
contents_
进行后续更改来更改原始内容。