跳转至

01:对话历史

最小 Chatbot 只有一次调用。用户下一句再问时,它不知道前面发生了什么,除非我们把历史消息传回去。

from __future__ import annotations

from pathlib import Path

from agent_patterns_lab.runtime import Message, MockLLM, Tracer


def main() -> None:
    tracer = Tracer()
    model = MockLLM(
        [
            "Got it: you like tea, local food, and easy walking.",
            "I still remember your preferences: tea, local food, and easy walking.",
        ]
    )

    messages: list[Message] = []

    def chat(user_text: str) -> str:
        messages.append(Message(role="user", content=user_text))
        answer = model.complete(messages, tracer=tracer)
        messages.append(Message(role="assistant", content=answer))
        return answer

    print(chat("Remember this: I like tea, local food, and easy walking."))
    print(chat("What preferences did I just give you?"))

    trace_path = tracer.export_jsonl(Path(".traces") / "01_conversation_history.jsonl")
    print(f"[trace] {trace_path}")


if __name__ == "__main__":
    main()

运行:

uv run python examples/01_conversation_history.py

代码怎么变了

关键变化是这几行:

messages.append(Message(role="user", content=user_text))
answer = model.complete(messages, tracer=tracer)
messages.append(Message(role="assistant", content=answer))

每轮对话后,我们都把用户消息和助手回答放回 messages。下一轮模型看到的就不是孤立问题,而是完整上下文。

它解决了什么

旅游助手现在能记住当前会话里的偏好,例如“我喜欢茶、本地小吃、轻松步行”。

它还是不够

对话历史只是“把文本带上”。它不能保证输出格式稳定。

如果你要把行程渲染到页面上,或者交给下一段代码处理,纯文本就很麻烦:今天模型写成列表,明天写成段落,后天漏掉打包建议。

下一步要解决:让模型输出可解析的数据。看 02:结构化输出