戳戳猫的小窝
更新日志
关于
## 1 单轮对话 在Apifox中,调用https://api.siliconflow.cn/v1/chat/completions接口,代码如下: ```json { "model": "Qwen/Qwen2.5-7B-Instruct", "messages": [ { "role": "system", "content": "你是一个优秀的助手" }, { "role": "user", "content": "地球的自转周期是多少?" } ], } ``` 结果如下: ```json { "id": "0195c301518884d3d327bb95fc52bded", "object": "chat.completion", "created": 1742733398, "model": "Qwen/Qwen2.5-7B-Instruct", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "地球的自转周期,通常指的是地球完成一次自转所需的时间,也就是我们说的一天。严格来说,根据不同的定义和测量方法,这个周期会有微小的差异。\n\n最常见的定义是一个恒星日,即地球相对于遥远恒星完成一次自转所需的时间,它的长度大约是23小时56分4秒,或者说简化的表达方式是大约24小时。\n\n另一方面,更为熟悉的“24小时”实际上是指太阳日,即地球从正午时分(对某个特定地点而言)返至下一次正午的时间间隔。由于地球在自转的同时还围绕太阳公转,所以由于地面对太阳位置的变化,一个太阳日(大约24小时)会比一个恒星日(23小时56分4秒)稍长一些。\n\n综上所述,地球的一个自转周期可以理解为恒星日,大约23小时56分4秒。" }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 24, "completion_tokens": 196, "total_tokens": 220 }, "system_fingerprint": "" } ``` 现在换一个问题: ```json { "model": "Qwen/Qwen2.5-7B-Instruct", "messages": [ { "role": "system", "content": "你是一个优秀的助手" }, { "role": "user", "content": "月球呢?" } ], } ``` 结果如下: ```json { "id": "0195c305cdf38bdabfeafce1f523fc11", "object": "chat.completion", "created": 1742733692, "model": "Qwen/Qwen2.5-7B-Instruct", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "月球是地球唯一的自然卫星,它是夜空中最亮的天体,距离地球大约38.4万公里。关于月球,我们可以讨论很多方面,比如它的形成理论、表面特征、探索历史等。您具体想了解哪方面的信息呢?" }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 21, "completion_tokens": 56, "total_tokens": 77 }, "system_fingerprint": "" } ``` 我们的目的原本是想接着上面的问题问月球的自转周期是多少,但是大模型似乎并没有关于上一个问题的记忆。大模型的每一次调用只能获取当前传过去的信息。 ## 2 对话历史 为了解决大模型无法记忆以往问答的问题,我们可以通过手动加上以往的问答来解决这样一个问题。 还是以上面的问题为例,我们想先问**“地球的自转周期是多少?”**,然后再问**“月球的自转周期是多少?”**。 首先还是问**“地球的自转周期是多少?”**,代码如下: ```json { "model": "Qwen/Qwen2.5-7B-Instruct", "messages": [ { "role": "system", "content": "你是一个优秀的助手" }, { "role": "user", "content": "地球的自转周期是多少?" } ], } ``` 结果如下: ```json { "id": "0195c301518884d3d327bb95fc52bded", "object": "chat.completion", "created": 1742733398, "model": "Qwen/Qwen2.5-7B-Instruct", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "地球的自转周期,通常指的是地球完成一次自转所需的时间,也就是我们说的一天。严格来说,根据不同的定义和测量方法,这个周期会有微小的差异。\n\n最常见的定义是一个恒星日,即地球相对于遥远恒星完成一次自转所需的时间,它的长度大约是23小时56分4秒,或者说简化的表达方式是大约24小时。\n\n另一方面,更为熟悉的“24小时”实际上是指太阳日,即地球从正午时分(对某个特定地点而言)返至下一次正午的时间间隔。由于地球在自转的同时还围绕太阳公转,所以由于地面对太阳位置的变化,一个太阳日(大约24小时)会比一个恒星日(23小时56分4秒)稍长一些。\n\n综上所述,地球的一个自转周期可以理解为恒星日,大约23小时56分4秒。" }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 24, "completion_tokens": 196, "total_tokens": 220 }, "system_fingerprint": "" } ``` 现在,消息列表中共有3组消息: 第一条: ```json { "role": "system", "content": "你是一个优秀的助手" } ``` 这个消息是我们给大模型设定了一个角色。 第二条: ```json { "role": "user", "content": "地球的自转周期是多少?" } ``` 这个消息是我们向大模型提出的问题。 第三条: ```json { "role": "assistant", "content": "地球的自转周期,通常指的是地球完成一次自转所需的时间,也就是我们说的一天。严格来说,根据不同的定义和测量方法,这个周期会有微小的差异。\n\n最常见的定义是一个恒星日,即地球相对于遥远恒星完成一次自转所需的时间,它的长度大约是23小时56分4秒,或者说简化的表达方式是大约24小时。\n\n另一方面,更为熟悉的“24小时”实际上是指太阳日,即地球从正午时分(对某个特定地点而言)返至下一次正午的时间间隔。由于地球在自转的同时还围绕太阳公转,所以由于地面对太阳位置的变化,一个太阳日(大约24小时)会比一个恒星日(23小时56分4秒)稍长一些。\n\n综上所述,地球的一个自转周期可以理解为恒星日,大约23小时56分4秒。" } ``` 这条消息是大模型返回给我们的结果。 此时,如果我们想接着上面的问题继续提问,只需要将上面三条消息在下次调用大模型时添加即可。 代码示例如下: ```json { "model": "Qwen/Qwen2.5-7B-Instruct", "messages": [ { "role": "system", "content": "你是一个优秀的助手" }, { "role": "user", "content": "地球的自转周期是多少?" }, { "role": "assistant", "content": "地球的自转周期,通常指的是地球完成一次自转所需的时间,也就是我们说的一天。严格来说,根据不同的定义和测量方法,这个周期会有微小的差异。\n\n最常见的定义是一个恒星日,即地球相对于遥远恒星完成一次自转所需的时间,它的长度大约是23小时56分4秒,或者说简化的表达方式是大约24小时。\n\n另一方面,更为熟悉的“24小时”实际上是指太阳日,即地球从正午时分(对某个特定地点而言)返至下一次正午的时间间隔。由于地球在自转的同时还围绕太阳公转,所以由于地面对太阳位置的变化,一个太阳日(大约24小时)会比一个恒星日(23小时56分4秒)稍长一些。\n\n综上所述,地球的一个自转周期可以理解为恒星日,大约23小时56分4秒。" }, { "role": "user", "content": "月球呢?" } ], } ``` 结果如下: ```json { "id": "0195c3129aec90f9ef51b016adb70261", "object": "chat.completion", "created": 1742734531, "model": "Qwen/Qwen2.5-7B-Instruct", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "月球的自转周期与地球的自转周期之间存在一种特殊的同步关系,称为潮汐锁定。这意味着月球的自转周期等于它绕地球公转的周期。因此,从地球上看,月球总是以同一面对着我们,我们只能看到月球的一半。\n\n月球完成一次绕地球公转所需的时间,即一个恒星月,大约是27.32178天。但由于地球同时也在绕太阳公转,月球相对地球的自转周期(即一个朔望月)会稍长一些,大约是29.53059天。然而,月球的自转周期与其绕地球公转周期相同,仍为27.32178天。\n\n总结一下:\n- 月球的恒星周期(绕地球公转周期)约为27.32178天。\n- 由于潮汐锁定,月球的自转周期同样约为27.32178天,使得它总是以同一面对着地球。" }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 234, "completion_tokens": 224, "total_tokens": 458 }, "system_fingerprint": "" } ``` ## 3 在Python中实现多轮对话 ### 3.1 创建OpenAI客户端 ```python client = OpenAI( api_key=os.getenv("OPENAI_API_KEY"), base_url="https://api.siliconflow.cn/v1", ) ``` ### 3.2 创建历史消息列表 ```python history = [ {"role": "system", "content": "你是一个优秀的助手。"} ] ``` ### 3.3 创建聊天函数 ```python def chat(query): history.append({"role": "user","content": query}) completion = client.chat.completions.create( model="Qwen/Qwen2.5-7B-Instruct", messages=history, temperature=0.3, ) result = completion.choices[0].message.content history.append({"role": "assistant","content": result}) return result ``` 此函数的参数接收要询问的问题,然后将问题以用户提问的消息添加到消息列表中,之后将消息列表发送给大模型,获得大模型的回答后,再将大模型的回答作为assistant消息附加到消息列表,同时将回答结果返回。 因此,此函数会2次附加消息,一次是在调用大模型前,将用户问题附加到消息列表,一次是在调用大模型后,将大模型回答的结果附加到消息列表。 ### 3.4 调用聊天函数 ```python print(chat("地球的自转周期是多少?")) print(chat("月球呢?")) ``` 结果如下: ``` 地球的自转周期大约是24小时,也就是一个太阳日。但是更精确地说,地球自转的真正周期是一个恒星日,约为23小时56分钟4秒。这个周期是地球相对于遥远恒星完成一次自转所需的时间。 月球绕地球公转的周期大约是27.3天,这被称为一个恒星月。然而,月球完成一次自转所需的时间与它的公转周期相同,因此月球的一个自转周期也是27.3天,这被称为一个同步月或同步周期。由于这种同步自转,月球总是以同一面对着地球,这就是为什么我们只能看到月球的同一面的原因。 ``` 当第一次调用**chat函数**时,会将问题和回答都附加到消息列表中,因此,第二次调用函数时,只需要问"**月球呢?"**,大模型会根据历史问答推测出我们是想问**"地球的自转周期是多少?"**。
多轮对话