You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask集成Gemini API时新请求返回历史Prompt结果的问题求助

解决Gemini API重复返回历史文本的问题

问题场景

基于Flask开发的Web文本改写应用,核心功能是选中页面文本后调用Gemini API进行改写。首次请求改写文本A时结果正常,但再次请求改写文本B时,API返回的是文本A+B的合并改写结果,不符合单次请求仅处理当前文本的预期。

前端获取选中文本的代码:

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'}]}]

问题原因

代码中使用contents.copy()进行的是浅拷贝,仅复制了外层列表和字典的引用,内部的parts列表仍然指向原contents中的同一个列表。每次请求时对contents_[0]['parts']的修改都会直接作用于原contents的parts列表,导致后续请求时parts里累积了所有历史文本,最终API处理的是所有历史文本加当前文本的内容。

解决方案

需要确保每次请求都使用独立的提示词结构,避免修改原对象,可通过两种方式实现:

方案1:使用深拷贝

引入copy模块,用deepcopy复制整个contents对象,确保所有嵌套结构都是全新的:

import copy

@app.route('/paraphrase', methods=['POST'])
def paraphrase():
    genai.configure(api_key=API_KEY)
    try:
        text = request.get_json().get('text')
        # 深拷贝contents,彻底隔离原对象
        contents_ = copy.deepcopy(contents)
        # 直接替换为当前请求的文本,简化冗余逻辑
        contents_[0]['parts'].append({'text': f"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 Exception as e:
        print(f"请求异常: {e}")
        return text

方案2:直接构建新提示词

无需依赖原contents变量,每次请求时直接生成全新的提示词结构:

@app.route('/paraphrase', methods=['POST'])
def paraphrase():
    genai.configure(api_key=API_KEY)
    try:
        text = request.get_json().get('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'},
                    {'text': f"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 Exception as e:
        print(f"请求异常: {e}")
        return text

额外优化建议

  • 移除原代码中append({'text': ' '})再替换的冗余逻辑,直接添加当前文本更清晰。
  • 替换空泛的except块,捕获具体异常并打印日志,方便后续排查问题。

内容的提问来源于stack exchange,提问作者GentleClash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 08:05:25