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
在这段代码中,首先定义了一个名为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()
方法时,就不会保留之前的记忆了。
在你提供的代码示例中,尽管你在第二次调用Generation.call()
方法时将messages
设置为空列表,同时也设置了history=None
,但实际上Dashscope(或是这里的qwen_turbo模型)可能不是基于这些变量来清除上下文记忆的。
通常情况下,在与大型语言模型交互时,要完全清除上下文,需要依赖于模型本身是否支持这样的操作。从你展示的API调用来看,Dashscope API 的 Generation.call()
方法似乎并没有直接提供清除整个对话历史的功能,即使清空了messages参数,模型仍然可能基于其内部的状态机制保留某种程度的上下文信息。
ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!欢迎加入技术交流群:微信公众号:魔搭ModelScope社区,钉钉群号:44837352