我的 LangChain 学习之旅:从提示词工程到智能体构建
引言
今天是我深入 LangChain 生态系统的一天。虽然感觉学习过程中遇到了不少挑战和错误,但回过头来整理,发现收获远比想象的多。从基础的提示词重写到复杂的 Agent 构建,每一个概念都在为构建更智能的 AI 应用打下基础。
今天的主要学习内容
1. 深入理解 MessagesPlaceholder 的工作机制
学习重点:MessagesPlaceholder 不是普通的字符串占位符,而是专门用于在聊天提示模板中插入消息对象列表的特殊组件。
核心发现:
- 它保持了对话历史的结构完整性,让 LLM 能够理解真正的对话轮次
- 与普通的
{chat_history}相比,它不会将消息列表转换为混乱的字符串 - 在多轮对话和 RAG 应用中至关重要
# 关键代码示例
rewrite_prompt = ChatPromptTemplate.from_messages([
("system", "根据对话历史改写用户问题..."),
MessagesPlaceholder(variable_name="chat_history"),
("human", "{question}")
])2. 掌握 RunnablePassthrough.assign 的数据流增强技术
学习重点:这是 LCEL 中的高级组件,用于在数据流中添加新信息而不丢失原有数据。
实际应用场景:
- 在 RAG 中同时保留用户问题和检索到的上下文
- 避免数据在链式传递中的丢失问题
- 实现数据流的优雅扩充
# 实践案例
rag_chain = RunnablePassthrough.assign(
context=(lambda x: x['question']) | retriever | format_docs
) | rag_prompt | model | StrOutputParser()3. 完成 RAG 提示词重写功能的实现
项目成果:成功构建了一个能够根据对话历史重写用户问题的 RAG 系统,提高了检索的准确性和对话的连贯性。
技术亮点:
- 使用对话历史优化检索查询
- 实现了多轮对话的上下文理解
- 提升了 RAG 系统的用户体验
4. 深入理解 LangChain Agent 的核心概念
重要认知转变:Agent 与 Chain 的根本区别在于决策的动态性:
- Chain:预定义的固定执行路径(像菜谱)
- Agent:基于 LLM 推理的动态决策系统(像有思考能力的大厨)
Agent 的三大核心组件:
- Tools:Agent 可使用的能力集合
- LLM:作为推理引擎的大脑
- Agent Executor:驱动 ReAct 循环的执行器
5. 探索多种搜索工具集成方案
实践经验:
- 发现了 DuckDuckGo 搜索的局限性
- 学习了 Tavily 搜索的优势:"We will be using Tavily (a search engine) as a tool"
- 成功实现了 Wikipedia 专用搜索 Agent
- 体验了不同工具在实际应用中的表现差异
6. 理解 LangChain Hub 的价值和作用
重要发现:LangChain Hub 是一个"提示词模板仓库",让开发者可以:
- 使用经过验证的高质量 Prompt 模板
- 避免从零开始设计复杂的 Agent Prompt
- 利用社区的集体智慧和最佳实践
# 使用 Hub 中的经典 ReAct 模板
prompt = hub.pull("hwchase17/react")7. 学会处理 LangChain 版本变更和 API 迁移
实战经验:
- 遇到了
ImportError和LangChainDeprecationWarning等版本兼容问题 - 学会了如何阅读错误信息和迁移指南
- 理解了 LangChain v0.2 的模块化架构变化
- 掌握了从旧版本 API 迁移到新版本的方法
今天遇到的挑战与解决方案
挑战 1:工具导入路径变更
问题:from langchain.agents import load_tools 已被弃用
解决:迁移到 from langchain_community.agent_toolkits import load_tools
挑战 2:Tavily 集成问题
问题:TavilySearchResults 的导入和使用方式发生变化
解决:使用传统但稳定的 Wikipedia 搜索工具作为替代方案
挑战 3:版本兼容性
问题:不同版本间的 API 差异 解决:学会查阅最新文档,使用稳定的替代方案
核心技术收获
1. ReAct 框架的深度理解
掌握了 ReAct(Reasoning and Acting)的核心思想:"The agent is using a reasoning engine to determine which actions to take to get a result"
ReAct 循环:
- Thought(思考):LLM 分析问题并规划下一步
- Action(行动):决定调用哪个工具
- Action Input(行动输入):确定工具的参数
- Observation(观察):接收工具执行结果
- 循环直至得到最终答案
2. 工具集成的最佳实践
学会了如何:
- 选择合适的搜索工具(Wikipedia vs Tavily vs DuckDuckGo)
- 自定义工具的创建和集成
- 处理工具调用中的错误和异常
3. 项目结构和错误处理
- 实现了健壮的错误处理机制
- 学会了使用
verbose=True调试 Agent 思考过程 - 掌握了模块化的代码组织方式
实际应用价值
今天的学习不仅仅是理论知识,更是实践技能的积累:
- RAG 系统优化:通过提示词重写提升了检索质量
- 智能对话能力:实现了具备工具调用能力的对话系统
- 知识检索增强:构建了专门的 Wikipedia 知识助手
- 错误处理经验:在解决版本兼容问题中积累了宝贵经验
未来学习方向
基于今天的学习基础,接下来的重点将是:
- LangGraph 深入学习:官方推荐:"For more information on Agents, please check out the LangGraph documentation"
- 多 Agent 系统构建:探索 "multi-agent workflows" 的应用场景
- 生产环境部署:学习 Agent 的性能优化和监控
- 自定义工具开发:为特定业务场景开发专用工具
总结与反思
虽然今天的学习过程中遇到了不少技术问题,但这些"坑"反而让我对 LangChain 的理解更加深入。"理论只能带你走这么远。你可以整天阅读文档,但真正的魔法——以及真正的头疼——在你真正构建一个时才会出现"
每一个错误都是学习的机会,每一次调试都是对框架更深层理解的积累。从提示词重写到 Agent 构建,从工具集成到版本迁移,这一天的学习为我在 AI 应用开发道路上奠定了坚实的基础。
最重要的收获:不是完美地运行了某段代码,而是培养了面对技术挑战时的解决能力,以及对 LangChain 生态系统的整体把握。这种能力,比任何单一的技术点都更加宝贵。
学习永无止境,每一天的积累都在为更大的突破做准备。今天的"挫折",都是明天成功的垫脚石。