使用API实现多轮对话,并拥有记忆功能¶

1. 个人实现¶

在实现循环的时候卡住了,回忆学习过的循环,如何把1-100加入到列表中,回忆代码如下: lst = [] for i in range(1, 101): lst.append(i)
print(lst)

总体代码如下:

In [12]:
from openai import OpenAI
client = OpenAI(api_key="sk-5e002cf488964cae9a5a88915228453f", base_url="https://api.deepseek.com")
In [14]:
messages = []
is_finished = False

while not is_finished:
    questions = input("你的问题是:")
    if questions == "finish":
        is_finished = True
    else:
        messages.append({"role": "user", "content": questions}) 
        response = client.chat.completions.create(
            model="deepseek-chat",
            messages=messages         # 将上面的 messages 传入到 API中
        )
    
        print(response)
        messages.append(response.choices[0].message)       # 将模型输出添加到 messages 的结尾
ChatCompletion(id='09544448-6e87-4141-a595-ca9dd12d0691', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='世界第一高峰是**珠穆朗玛峰**。\n\n**关键信息:**\n\n*   **海拔高度:** 最新测量的岩面高(不含雪盖)为 **8848.86米**。这是中国和尼泊尔共同官方宣布的高度。\n*   **地理位置:** 位于亚洲的**喜马拉雅山脉**,是中国(西藏)与尼泊尔的界山。\n*   **名称:** 藏语名称为“珠穆朗玛”,意为“圣母”;尼泊尔语名称为“萨加玛塔”,意为“天空之额”;英文名“Everest”是为了纪念前英国印度测量局局长乔治·埃佛勒斯。\n\n因此,无论从哪个标准来看,珠穆朗玛峰都是当之无愧的世界之巅。', refusal=None, role='assistant', annotations=None, audio=None, function_call=None, tool_calls=None))], created=1760944105, model='deepseek-chat', object='chat.completion', service_tier=None, system_fingerprint='fp_ffc7281d48_prod0820_fp8_kvcache', usage=CompletionUsage(completion_tokens=162, prompt_tokens=9, total_tokens=171, completion_tokens_details=None, prompt_tokens_details=PromptTokensDetails(audio_tokens=None, cached_tokens=0), prompt_cache_hit_tokens=0, prompt_cache_miss_tokens=9))
ChatCompletion(id='63c2ddbf-1ab3-4239-9580-38bf99968402', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='您第一个问题是:“世界第一高峰是?”', refusal=None, role='assistant', annotations=None, audio=None, function_call=None, tool_calls=None))], created=1760944174, model='deepseek-chat', object='chat.completion', service_tier=None, system_fingerprint='fp_ffc7281d48_prod0820_fp8_kvcache', usage=CompletionUsage(completion_tokens=9, prompt_tokens=180, total_tokens=189, completion_tokens_details=None, prompt_tokens_details=PromptTokensDetails(audio_tokens=None, cached_tokens=128), prompt_cache_hit_tokens=128, prompt_cache_miss_tokens=52))
ChatCompletion(id='e02403f1-ef51-4b59-92f0-4980d84f9118', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='世界第二高峰是 **K2(乔戈里峰)**。\n\n**关键信息:**\n\n*   **海拔高度:** 8,611米。\n*   **地理位置:** 位于喀喇昆仑山脉,是中国(新疆)与巴基斯坦的界山。\n*   **名称:** 它的通用名称是K2(喀喇昆仑2号的缩写)。其国际通行的官方名称就是K2。“乔戈里”是藏语的音译,意为“白色女神”。\n*   **攀登难度:** K2因其巨大的攀登难度、恶劣的天气和复杂的地形而闻名,被登山者称为 **“野蛮巨峰”** ,其攀登死亡率远高于珠穆朗玛峰,被认为是技术性最强、最危险的八千米级山峰。', refusal=None, role='assistant', annotations=None, audio=None, function_call=None, tool_calls=None))], created=1760944190, model='deepseek-chat', object='chat.completion', service_tier=None, system_fingerprint='fp_ffc7281d48_prod0820_fp8_kvcache', usage=CompletionUsage(completion_tokens=160, prompt_tokens=199, total_tokens=359, completion_tokens_details=None, prompt_tokens_details=PromptTokensDetails(audio_tokens=None, cached_tokens=128), prompt_cache_hit_tokens=128, prompt_cache_miss_tokens=71))

不难发现,上述代码有2处需要改进:

  1. 用嵌套来实现循环结束,略微复杂,可以考虑用 break 终止循环;
  2. 回答的内容包含了太多无关信息,应该把纯回答的文字部分抽取出来。(需求)

2. 老师代码¶

In [ ]:
messages = []     # 用来储存历史对话,后期学完文件读取,可以考虑持久化存储!
In [15]:
while True:
    prompt = input("请输入你的问题:")
    if prompt.lower() in ["quit", "q", "exit", "退出"]:
        break
    messages.append({"role": "user", "content": prompt}) 
    response = client.chat.completions.create(
            model="deepseek-chat",
            messages=messages         # 将上面的 messages 传入到 API中
        )
    assistant_content = response.choices[0].message.content
    messages.append({"role": "assistant", "content": assistant_content}) # 这一步只将内容和身份保存进去,剔除了无用信息,节省空间
    print(f"Message: {assistant_content}")
Message: 世界第一高峰是**珠穆朗玛峰**。

**关键信息:**
*   **海拔高度**:8848.86米(2020年最新岩面高程)。
*   **地理位置**:位于亚洲的**喜马拉雅山脉**中段,是中国与尼泊尔的界峰。
*   **名称来源**:藏语名“珠穆朗玛”意为“大地之母”,尼泊尔称“萨加玛塔”。英文名“Everest”源于英国地理学家乔治·埃佛勒斯。

珠穆朗玛峰以其巍峨险峻闻名,是全球登山爱好者挑战的终极目标。
Message: 世界第一高峰是?
Message: 乔戈里峰(K2)