赞
踩
大模型的多轮问答
难点就是在于如何精确识别用户最新的提问的真实意图
,而在常见的使用大模型进行多轮对话方式中,我接触到的只有两种方式
:
user
和 assistant
两个角色将一问一答的会话内容喂给大模型,让它能够结合最新的问题靠自己去理解用户的最新的问题的含义。两种方式都可以,但是在我目前的业务上我目前使用的是后者
,因为比较容易实现,效果也不错。
这是使用的是 qwen
的多轮问答 api ,要使用这一种方式,需要维护一个相当长的历史会话记录 messages
,而且要保证 messages
中的 user/assistant
消息交替出现,这是一个必须要遵循的条件,如果是碰到异常,必须要对 messages 中最后的无效对话进行清理。这里就是将理解用户意图和解决用户的问题都混在了一块,对于我要做的业务,回答内容的不确定性太高,而且实现成本也高,需要在会话中加入大量业务代码,所以果断放弃了。
这里的代码主要实现了一个简易地关于烹饪的对话,只有两轮,实现逻辑比较简单,写的比较粗糙,理解意思即可。
ini 复制代码 def multi_round(): messages = [{'role': 'system', 'content': '你是一个绝佳的烹饪助手'}, {'role': 'user', 'content': '如何做西红柿炖牛腩?'}] response = Generation.call(model="qwen-turbo", messages=messages, result_format='message') if response.status_code == HTTPStatus.OK: print(response) messages.append({'role': response.output.choices[0]['message']['role'], 'content': response.output.choices[0]['message']['content']}) # 将assistant的回复添加到messages列表中 else: print(response.message) messages = messages[:-1] # 如果响应失败,将最后一条user message从messages列表里删除,确保 user/assistant 消息交替出现 messages.append({'role': 'user', 'content': '不放糖可以吗?'}) # 将新一轮的user问题添加到messages列表中 response = Generation.call(model="qwen-turbo", messages=messages, result_format='message', ) if response.status_code == HTTPStatus.OK: print(response) messages.append({'role': response.output.choices[0]['message']['role'], 'content': response.output.choices[0]['message']['content']}) # 将第二轮的assistant的回复添加到messages列表中 else: print(response.message) messages = messages[:-1] # 如果响应失败,将最后一条user message从messages列表里删除,确保 user/assistant 消息交替出现
在我所做地业务中,对于 assistant
的回复不关心,主要关心的是用户的问题
,所以我只关注 user
的历史提问,在实现的时候只需要维护一个列表 history
,始终将最新的用户提问追加即可,为了保证列表信息的有效性,我始终只维护最后 10
个问题。我这里使用 qwen-max
模型对历史提问进行总结,并且按照我要求的方式进行输出。也就是说这个模型只负责总结历史问题,对于业务问题的回答是其他大模型干的事情,任务分工明确就减少了不确定性。
python 复制代码 history = [] @app.route('/getAnwser', methods=["POST"]) def getAnwser(): data = request.get_json() question = data['question'] global history history.append(question) history = history[-10:] # 始终只维护最后 10 个问题 print("正在解析用户意图...\n\n") try: # 将 history 拼接成字符串传入 prompt 中 history_str = "" if history: history_str = '[' for h in history: history_str += f"'{h}'," history_str.strip(",") history_str += ']' messages = [ {'role': 'system', 'content': '您是一名精通总结多轮问题含义的助手,请根据历史问题做出有效的判断,帮我总结最新的问题,保证不会丢失关键信息,需要注意的是越靠近新的对话越重要'}, {'role': 'user', 'content': f"历史上我依次提问了以下问题:{history_str},请帮我总结出我最新的问题,不要做冗余的解释或者赘述。如果用户提出的问题语义模糊不清无法识别,可以直接返回空字符串。答案的模板必循遵循”【{{我的最新的问题描述}}】“"} ] response = Generation.call(model="qwen-max", messages=messages, result_format='message') if response.status_code == HTTPStatus.OK: resp = response.output.choices[0]['message']['content'].replace("【", "").replace("】", "") else: raise Exception("接口限流,请稍后重试。") print(f"您的最新问题是:{resp} \n\n") except BaseException as e: if history: history = history[:-1] # 异常时候,将本次新增的问题删除 print( f"Error: {str(e)}\n\n".encode())
作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。
但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料
包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/879541
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。