1. 对话历史管理 (Memory)
1.1 状态管理与 Prompt 结合
在构建大模型应用时,对话历史管理是核心挑战之一。传统方法使用ConversationChain和ConversationBufferMemory,但LangChain 0.1之后更推荐使用RunnableWithMessageHistory。这个方案的优势在于:
- 完美契合LCEL(LangChain Expression Language)语法
- 支持灵活的后端存储方案
- 与Prompt模板无缝集成
实际开发中,我们通常需要结合ChatPromptTemplate来构建完整的对话流程。关键点在于:
- 使用MessagesPlaceholder预留历史消息插入位置
- 通过session_id区分不同用户的对话上下文
- 将记忆功能封装为可复用的组件
这里有个重要细节:生产环境中建议使用RedisChatMessageHistory而非InMemoryChatMessageHistory,因为:
- 支持分布式部署
- 具备持久化能力
- 可以设置TTL自动清理过期会话
1.2 关键技巧:消息裁剪 (Trim Messages)
随着对话轮次增加,上下文窗口限制和API成本会成为突出问题。trim_messages工具提供了几种实用策略:
- 按Token数量裁剪(max_tokens参数)
- 按消息数量裁剪(max_messages参数)
- 混合裁剪策略(结合count和last等选项)
实际应用中需要注意:
- 始终保留SystemMessage(include_system=True)
- 确保裁剪后以HumanMessage开头(start_on="human")
- 根据模型上下文窗口调整max_tokens值
提示:token_counter参数可以传入自定义的token计数函数,当使用非OpenAI模型时特别有用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 工具调用 (Tool Calling)
2.1 定义工具:文档与类型提示是灵魂
工具定义的质量直接影响模型调用效果。最佳实践包括:
- 使用Google风格或Numpy风格的Docstring
- 为所有参数添加类型提示
- 对复杂参数使用Pydanti
