我使用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_
的后续更改不会影响原始内容。