HPCL-EI / RoboWaiter

大模型具身智能比赛-机器人控制端
MIT License
49 stars 11 forks source link

多轮对话测试失败,缺少大模型端相关内容 #1

Closed EliwiiKeeya closed 5 months ago

EliwiiKeeya commented 5 months ago

问题描述

无法调用大模型进行多轮对话,本地大模型端需要配置请求处理及响应格式相关内容 可能存在bug

何处产生了问题?

文件:./llm_client/multi_rounds.py 在遵循教程尝试调用大模型接口的过程中,我注意到部署的本地模型需要按照设定好的请求格式进行接收处理,并以特定格式返回响应,我的本地模型未实现这部分功能,无法提供有意义的响应。 get_response方法在接收服务端数据响应内容后无返回值,导致ask_llm方法报错,这可能是一个bug

可能的get_response方法修正 ```python def get_response(sentence, history, allow_function_call = True): if sentence: history.append({"role": "user", "content": sentence}) if sentence in fix_questions_dict: time.sleep(2) return True, parse_fix_question(sentence) params = dict(model="RoboWaiter") params['messages'] = role_system + list(history) if allow_function_call: params["functions"] = functions print(f"请求URL: {base_url}/v1/chat/completions") print(f"请求参数: {params}") response = requests.post(f"{base_url}/v1/chat/completions", json=params) if response.status_code == 200: try: decoded_line = response.json() print(f"响应内容: {decoded_line}") return True, decoded_line["response"] # <--------------------------------- 加入了返回值 except json.JSONDecodeError: logger.error(f"解析JSON失败,响应内容:{response.text}") else: logger.error(f"请求失败,状态码:{response.status_code}, 响应内容:{response.text}") # 根据需要处理错误或返回一个错误信息 return True, {"error": "Internal Server Error", "status_code": response.status_code} ```

测试过程

我建立了一个本地空响应服务器,确定机器人端和服务端能够正常通信。

通信测试API ```python # -*- encoding: utf-8 -*- # @File : api-test-02.py # @Date : 2024/02/29 12:38:30 # @Author : Eliwii_Keeya from fastapi import FastAPI, Request import uvicorn import json import datetime app = FastAPI() @app.post("/v1/chat/completions") async def create_item(request: Request): # json_post_raw = await request.json() # json_post = json.dumps(json_post_raw) # history = json_post_raw["messages"] response_template = { "choices": [ {"message": {"role": "assistant", "content": "这是一条助手的消息"}} ] } now = datetime.datetime.now() time = now.strftime("%Y-%m-%d %H:%M:%S") answer = { "response": response_template, # "history": history.append(response_template), "status": 200, "time": time } log = "[" + time + "] " print(log) return answer if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8001, workers=1) ```
PS D:\CHAT_GLM\ChatGLM-6B-main> python -u api-test-02.py
INFO:     Started server process [34932]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8001 (Press CTRL+C to quit)python -u api-test-02.py
运行信息
PS D:\HarixSim> python -u "d:\HarixSim\RoboWaiter-main\robowaiter\llm_client\multi_rounds.py"

Customer:这是一条客户的消息
请求URL: http://127.0.0.1:8001/v1/chat/completions
请求参数: {'model': 'RoboWaiter', 'messages': [{'role': 'system', 'content': '你是RoboWaiter,一个由HPCL团队开发的机器人服务员,你在咖啡厅工作。接受顾客的指令并调用工具 函数来完成各种服务任务。如果顾客问你们这里有什么,或者想要点单,你说我们咖啡厅提供咖啡,水,点心,酸奶等食物。如果顾客不需要你了,你就回到吧台招待。如果顾客叫你去做某事,你回复:好的,我马上去做这件事。'}, {'role': 'user', 'content': '这是一条客户的消息'}], 'functions': {'create_sub_task': {'name': 'create_sub_task', 'description': ' 当需要完成具身任务(如做咖啡,拿放物体,扫地,前往某位置)时,调用该函数,根据用户的提示进行意图理解,生成子任务的目标状态集合 `goal`(以一阶逻辑的形式表示),用户意图\n做一杯咖啡,则该函数的参数为 "On(Coffee,Bar)",\n前往一号桌,则该函数的参数为 "At(Robot,Table1)",\n前往二号桌,则该函数的参数为 "At(Robot,Table2)",\n打开空调,则该函数的参 数为 "Is(AC,On)",\n关空调,则该函数的参数为 "Is(AC,Off)",\n打开窗帘,则该函数的参数为 "Is(Curtain,On)",\n关闭窗帘,则该函数的参数为 "Is(Curtain,Off)",\n拖地,则该函数的参数为 "Is(Floor,Clean)",\n打开大厅灯,则该函数的参数为 "Is(HallLight,On)",', 'params': [{'name': 'goal', 'description': '子任务需要达到的目标条件集合,例如{On(Coffee,Bar)} ,{At(Robot,Table1)},{Is(AC,Off)}', 'type': 'str', 'required': True}]}, 'stop_serve': {'name': 'stop_serve', 'description': '当顾客通过任何形式表示不再需要服务时,调用该函数', 'params': []}, 'get_object_info': {'name': 'get_object_info', 'description': '获取场景中`object`的位置信息。在询问物品位置时调用该函数,以辅助场景交互,不执行 动作\n例如:\n    `object`在哪里?\n    哪有`object`\n    哪里有`object`?\n     `object`在哪里\n    哪里有`object`\n    `object`放在哪里\n    我在哪儿能找到`object`\n    你们这儿有`object`吗?\n    你们这里有`object`\n    你看见`object`了吗?\n    `object`在你们这里吗\n    `object`,你看见过吗?\n遇到上述问题时,调用该函数,并根据返 回的结果回复物体位置信息,例如', 'params': [{'name': 'obj', 'description': '需要获取位置的物体名称', 'type': 'str', 'required': True}]}, 'get_number_of_objects': {'name': 'get_number_of_objects', 'description': "获取场景中物体数量。当询问场景中的物体数量时,需要调用这个工具。\n例如询问:\n    `obj`有多少?\n    有多少`obj`\n    你们还有`obj`\n    '桌子有几张'\n    `obj`还有多的吗?\n    `obj`有几个\n    `obj`有多少个\n这个工具用于获取场景中指定物体 `obj` 的数量,返回一个整数,不涉及到具体的执行任务 。\n如果`obj`是咖啡,如果场景中有5杯咖啡,就返回 5\n如果`obj`是桌子,如果场景中有7张桌子,就返回 7\n如果`obj`是行人,如果场景中有10个顾客,就返回 10", 'params': [{'name': 'obj', 'description': '需要获取数量的物体名称', 'type': 'str', 'required': True}]}}}
响应内容: {'response': {'choices': [{'message': {'role': 'assistant', 'content': '这是一条助手的消息'}}]}, 'status': 200, 'time': '2024-02-29 22:21:37'}
2024-02-29 22:21:37.505 | INFO     | __main__:deal_response:126 - Final Reply:
这是一条助手的消息
2 history records:
{'role': 'user', 'content': '这是一条客户的消息'}
{'role': 'assistant', 'content': '这是一条助手的消息'}

Customer:

基于当前项目代码自行开发大模型端接口对我而言是困难的,如果能够提供相关功能进行测试,将会给我很大的帮助。

需要什么样的帮助?

我希望能够了解大模型端的部分功能:

其他内容

EliwiiKeeya commented 5 months ago

通过检查发现本地代码经过修改,和原有代码不匹配,我对可能带来的不便感到抱歉。