我的 LangChain 学习之旅:从提示词工程到智能体构建

2025 年 9 月 9 日 星期二
15

我的 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 的三大核心组件

  1. Tools:Agent 可使用的能力集合
  2. LLM:作为推理引擎的大脑
  3. 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 迁移

实战经验

  • 遇到了 ImportErrorLangChainDeprecationWarning 等版本兼容问题
  • 学会了如何阅读错误信息和迁移指南
  • 理解了 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 思考过程
  • 掌握了模块化的代码组织方式

实际应用价值

今天的学习不仅仅是理论知识,更是实践技能的积累:

  1. RAG 系统优化:通过提示词重写提升了检索质量
  2. 智能对话能力:实现了具备工具调用能力的对话系统
  3. 知识检索增强:构建了专门的 Wikipedia 知识助手
  4. 错误处理经验:在解决版本兼容问题中积累了宝贵经验

未来学习方向

基于今天的学习基础,接下来的重点将是:

  1. LangGraph 深入学习:官方推荐:"For more information on Agents, please check out the LangGraph documentation"
  2. 多 Agent 系统构建:探索 "multi-agent workflows" 的应用场景
  3. 生产环境部署:学习 Agent 的性能优化和监控
  4. 自定义工具开发:为特定业务场景开发专用工具

总结与反思

虽然今天的学习过程中遇到了不少技术问题,但这些"坑"反而让我对 LangChain 的理解更加深入。"理论只能带你走这么远。你可以整天阅读文档,但真正的魔法——以及真正的头疼——在你真正构建一个时才会出现"

每一个错误都是学习的机会,每一次调试都是对框架更深层理解的积累。从提示词重写到 Agent 构建,从工具集成到版本迁移,这一天的学习为我在 AI 应用开发道路上奠定了坚实的基础。

最重要的收获:不是完美地运行了某段代码,而是培养了面对技术挑战时的解决能力,以及对 LangChain 生态系统的整体把握。这种能力,比任何单一的技术点都更加宝贵。


学习永无止境,每一天的积累都在为更大的突破做准备。今天的"挫折",都是明天成功的垫脚石。

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...