开发者社区 > ModelScope模型即服务 > 正文

ModelScope 在使用dashscope模型的时候提问记忆清空但是还有记忆怎么办?

ModelScope 在使用dashscope模型的时候提问记忆清空但是还有记忆怎么办?
在使用dashscope模型的时候,先给llm定义了一个系统角色,然后又提了问,然后把history设置成None,messages也清空了,这时llm应该对之前的提问没有记忆了,但是,llm的返回还有对于之前的记忆,这是怎么回事?


from http import HTTPStatus
from dashscope import Generation
from dashscope.api_entities.dashscope_response import Role
SYSTEM_FUNCTION="you are an assistant"

def Agent(SYSTEM_FUNCTION):
    messages = [{'role': Role.SYSTEM, 'content': SYSTEM_FUNCTION},
                {'role': Role.USER, 'content': '如何做西红柿炖牛腩?'}]
    response = Generation.call(
        Generation.Models.qwen_turbo,
        messages=messages,
        result_format='message',  # set the result to be "message" format.
    )
    if response.status_code == HTTPStatus.OK:
        print(response)
        # append result to messages.
        messages.append({'role': response.output.choices[0]['message']['role'],
                         'content': response.output.choices[0]['message']['content']})
    else:
        print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
            response.request_id, response.status_code,
            response.code, response.message
        ))
    #messages.append({'role': Role.USER, 'content': '不放糖可以吗?'})
    #messages=[({'role': Role.USER, 'content': '不放糖可以吗?'})]
    messages=[]
    print('messages---',messages)
    print('messages over')
    # make second round call
    response = Generation.call(
        Generation.Models.qwen_turbo,
        messages=messages,
        result_format='message',  # set the result to be "message" format.
        history=None,
        prompt=''
    )
    if response.status_code == HTTPStatus.OK:
        print(response)
    else:
        print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
            response.request_id, response.status_code,
            response.code, response.message
        ))


conversation_with_messages()
输出
{"status_code": 200, "request_id": "798e454f-16bb-9850-903c-9886d2797005", "code": "", "message": "", "output": {"text": null, "finish_reason": null, "choices": [{"finish_reason": "stop", "message": {"role": "assistant", "content": "材料:\n牛腩,西红柿,姜片,八角,香叶,草果,干辣椒,老抽,生抽,料酒,冰糖,盐,小葱\n\n做法:\n\n1. 牛腩切块,冷水下锅焯水去血沫,捞出备用。\n2. 炒锅放少许油,放入冰糖炒化成红色糖色,加入姜片,大料(八角,香叶,草果),干辣椒翻炒出香味。\n3. 加入焯过水的牛腩块,大火煸炒至上色。\n4. 倒入料酒,生抽,老抽,翻炒均匀后加入热水,水量没过牛腩即可。\n5. 大火烧开后转中小火慢炖40分钟。\n6. 西红柿去蒂去籽切块,炖至牛肉软烂时,加入西红柿块,继续炖煮15分钟左右。\n7. 最后加盐调味,撒上葱花即可。如果喜欢口感更酸一些,可以适当多放些西红柿。"}}]}, "usage": {"input_tokens": 13, "output_tokens": 227, "total_tokens": 240}}
messages--- [{'role': 'system', 'content': 'You are a helpful assistant.'}, {'role': 'user', 'content': '如何做西红柿炖牛腩?'}, {'role': 'assistant', 'content': '材料:\n牛腩,西红柿,姜片,八角,香叶,草果,干辣椒,老抽,生抽,料酒,冰糖,盐,小葱\n\n做法:\n\n1. 牛腩切块,冷水下锅焯水去血沫,捞出备用。\n2. 炒锅放少许油,放入冰糖炒化成红色糖色,加入姜片,大料(八角,香叶,草果),干辣椒翻炒出香味。\n3. 加入焯过水的牛腩块,大火煸炒至上色。\n4. 倒入料酒,生抽,老抽,翻炒均匀后加入热水,水量没过牛腩即可。\n5. 大火烧开后转中小火慢炖40分钟。\n6. 西红柿去蒂去籽切块,炖至牛肉软烂时,加入西红柿块,继续炖煮15分钟左右。\n7. 最后加盐调味,撒上葱花即可。如果喜欢口感更酸一些,可以适当多放些西红柿。'}, {'role': 'user', 'content': '不放糖可以吗?'}]
messages over
{"status_code": 200, "request_id": "aa8936ed-3380-958a-bfd5-6dd86530e458", "code": "", "message": "", "output": {"text": null, "finish_reason": null, "choices": [{"finish_reason": "stop", "message": {"role": "assistant", "content": "当然可以,放糖主要是为了给菜品增加色泽和甜度,如果你不喜欢或认为糖分过高,完全可以省略这一步。在炖煮过程中,牛腩和西红柿自然会带出一些甜味,所以不做糖处理也是可以的。不过要注意的是,如果不放糖,可能会使最终成品的颜色稍微偏深一些。"}}]}, "usage": {"input_tokens": 246, "output_tokens": 72, "total_tokens": 318}}
add Codeadd Markdown

展开
收起
你鞋带开了~ 2024-02-19 19:30:37 70 0
2 条回答
写回答
取消 提交回答
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    在这段代码中,首先定义了一个名为Agent的函数,该函数接受一个名为SYSTEM_FUNCTION的参数。在函数内部,首先创建了一个名为messages的列表,其中包含两个字典,分别表示系统角色和用户角色及其内容。然后调用Generation.call()方法生成回答,并将结果添加到messages列表中。接下来,将messages列表清空,并再次调用Generation.call()方法生成回答。

    问题出在第二次调用Generation.call()方法时,虽然将messages列表清空了,但是仍然保留了之前的记忆。这是因为在第一次调用Generation.call()方法时,已经将系统角色和用户角色及其内容添加到了messages列表中。尽管在第二次调用时将messages列表清空了,但是在生成回答时,模型仍然会参考之前的记忆。

    为了解决这个问题,可以在第二次调用Generation.call()方法时,将history参数设置为None,以清除之前的记忆。修改后的代码如下:

    def Agent(SYSTEM_FUNCTION):
        messages = [{'role': Role.SYSTEM, 'content': SYSTEM_FUNCTION},
                    {'role': Role.USER, 'content': '如何做西红柿炖牛腩?'}]
        response = Generation.call(
            Generation.Models.qwen_turbo,
            messages=messages,
            result_format='message',  # set the result to be "message" format.
        )
        if response.status_code == HTTPStatus.OK:
            print(response)
            # append result to messages.
            messages.append({'role': response.output.choices[0]['message']['role'],
                             'content': response.output.choices[0]['message']['content']})
        else:
            print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
                response.request_id, response.status_code,
                response.code, response.message
            ))
        #messages.append({'role': Role.USER, 'content': '不放糖可以吗?'})
        #messages=[({'role': Role.USER, 'content': '不放糖可以吗?'})]
        messages=[]
        print('messages---',messages)
        print('messages over')
        # make second round call
        response = Generation.call(
            Generation.Models.qwen_turbo,
            messages=messages,
            result_format='message',  # set the result to be "message" format.
            history=None,
            prompt=''
        )
        if response.status_code == HTTPStatus.OK:
            print(response)
        else:
            print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
                response.request_id, response.status_code,
                response.code, response.message
            ))
    
    conversation_with_messages()
    

    这样,在第二次调用Generation.call()方法时,就不会保留之前的记忆了。

    2024-02-22 13:56:01
    赞同 展开评论 打赏
  • 在你提供的代码示例中,尽管你在第二次调用Generation.call()方法时将messages设置为空列表,同时也设置了history=None,但实际上Dashscope(或是这里的qwen_turbo模型)可能不是基于这些变量来清除上下文记忆的。

    通常情况下,在与大型语言模型交互时,要完全清除上下文,需要依赖于模型本身是否支持这样的操作。从你展示的API调用来看,Dashscope API 的 Generation.call() 方法似乎并没有直接提供清除整个对话历史的功能,即使清空了messages参数,模型仍然可能基于其内部的状态机制保留某种程度的上下文信息。

    2024-02-20 09:18:19
    赞同 1 展开评论 打赏

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!欢迎加入技术交流群:微信公众号:魔搭ModelScope社区,钉钉群号:44837352

相关电子书

更多
视觉AI能力的开放现状及ModelScope实战 立即下载
ModelScope助力语音AI模型创新与应用 立即下载
低代码开发师(初级)实战教程 立即下载