第11章 进阶:LangChain与外部工具调用

1. 引言

在上一章,我们成功地创造了我们的第一个“生命”——一个可以对话的机器人。我们为它的诞生而兴奋,但很快我们就会发现它的局限性。它就像一个被囚禁在玻璃房中的天才大脑,拥有渊博的知识,却与真实世界完全隔离。

  • 你问它:“今天的天气怎么样?” 它会抱歉地告诉你,它的知识截止于202x年,无法获取实时信息。
  • 你问它:“345乘以123等于多少?” 它可能会给出一个看似合理但实际上错误的结果,因为它是在“预测”一个答案,而不是在“计算”。
  • 你让它:“帮我总结一下这个网页的内容:[URL]”。它会告诉你它无法访问互联网。

这个“玻璃房”,就是大语言模型固有的两大局限:知识的非时效性能力的非行动性。要打破这堵墙,我们需要为它装上“眼睛”(访问网络)、“耳朵”(读取文件)和“双手”(调用工具)。

本章,我们将学习一个革命性的框架——LangChainLangChain就像一个“超级胶水”或“瑞士军刀”,它提供了一整套标准化的组件和接口,可以轻松地将我们的大模型与外部数据源、API和各种工具“链接”在一起,构建出远比简单对话复杂和强大的应用程序。

本章学习目标:

  • 理解LLM的核心局限:深刻认识为什么LLM需要与外部世界交互。
  • 掌握LangChain的核心思想:理解“链(Chain)”的概念,以及它如何编排和组合不同的AI组件。
  • 学习LangChain的核心组件:熟悉Models, Prompt Templates, Chains, ToolsAgents这些构建块。
  • 构建一个智能代理(Agent):亲手创造一个能自主思考、决策并使用外部工具(如搜索引擎)来回答问题的智能应用。

本章核心问题:

  • 如何让大模型获取训练数据之外的、最新的知识?
  • 如何赋予大模型使用计算器、搜索引擎、数据库查询等“超能力”?
  • 什么是“智能代理(Agent)”?它和我们之前写的聊天机器人有什么本质区别?

如果说上一章我们学会了如何“使用”一个大脑,那么本章,我们将学习如何为这个大脑构建一个完整的“身体”和“神经系统”,让它的智能真正得以延伸和作用于真实世界。


2. 正文

2.1 打破“次元壁”:为何需要LangChain?

一个标准的大语言模型(LLM),本质上是一个函数:输入一段文本,输出一段文本。f(prompt) -> completion。它的所有能力都封装在这个函数内部。LangChain的核心哲学,就是不把LLM看作一个封闭的黑盒,而是看作一个可以被编排和调度的核心引擎

LangChain主要解决了LLM的两大痛点:

  1. 数据连接 (Data Connection): LLM的知识是静态的。LangChain可以帮助LLM连接到各种外部数据源,如个人文档、数据库、API等,实现基于私有数据或实时数据的问答。
  2. 代理能力 (Agency): LLM本身无法采取行动。LangChain引入了“智能代理”的概念,让LLM可以根据用户的指令,自主地决定调用哪个外部工具(如搜索引擎、计算器、Python解释器),并利用工具返回的结果来完成任务。

直观比喻:从博学的教授到全能的CEO

  • 标准LLM:一位知识渊博但被锁在图书馆里的老教授。他能回答你基于馆内藏书的所有问题,但对外界发生的新鲜事一无所知,也无法派人帮你办事。
  • 使用LangChain的LLM:一位运筹帷幄的CEO。他自己(LLM)是大脑,负责思考和决策。他手下有一群能力各异的专业助理(Tools),比如市场研究员(搜索引擎)、财务分析师(计算器)、法务顾问(数据库查询)等。当接到一个复杂任务时,CEO会思考(Reasoning),然后指令相应的助理去执行(Action),并根据助理反馈的结果,进行下一步的思考和决策,直到任务完成。

2.2 LangChain核心组件解构

LangChain通过一系列标准化的组件,让构建复杂应用变得模块化和简单。

graph TDsubgraph LangChain应用构建块A[Models<br/>(语言模型)]B[Prompt Templates<br/>(提示词模板)]C[Chains<br/>(调用链)]D[Agents & Tools<br/>(代理与工具)]endA & B --> C;A & D --> E{复杂LLM应用};C --> E;
  1. Models: 这是核心的“大脑”。LangChain为各种LLM(如OpenAI的GPT系列、Hugging Face上的开源模型等)提供了统一的接口,让你可以在不修改上层代码的情况下,轻松切换底层模型。

  2. Prompt Templates: 这是与模型沟通的“话术”。我们很少直接将用户的输入发给模型,而是会用一个模板把它包装一下,给出更清晰的指令。LangChainPromptTemplate可以轻松地处理带有变量的提示词。

    from langchain.prompts import PromptTemplatetemplate = "请将以下英文翻译成{language}: {text}"
    prompt = PromptTemplate(template=template, input_variables=["language", "text"])formatted_prompt = prompt.format(language="法语", text="Hello, world!")
    # -> "请将以下英文翻译成法语: Hello, world!"
    
  3. Chains: 这是LangChain名字的由来,也是其最核心的抽象。就是将多个组件(可以是LLM,也可以是其他链)按顺序组合在一起,完成一个特定的任务。最基础的链是LLMChain,它简单地将PromptTemplateModel链接在一起。

  4. Agents & Tools: 这是LangChain最强大、最神奇的部分。

    • Tool: 一个工具就是一个函数,它能执行一个特定的、原子化的任务。例如,GoogleSearchToolCalculatorToolPythonREPLTool
    • Agent: 一个代理就是一个搭载了LLM的决策引擎。它接收用户的复杂指令,然后自主地进行思考,决定是否需要使用工具使用哪个工具、以及如何使用这个工具。这个思考-行动的循环被称为ReAct (Reason + Act)

2.3 代码实战:打造一个能上网搜索的“研究员”Bot

现在,我们将利用LangChainAgentTool,把我们上一章的机器人,从一个“聊天家”升级为一个能上网冲浪的“研究员”。

场景定义
我们要构建一个问答机器人。当被问到一个它知识范围内不知道的问题时(比如关于最近发生的新闻),它应该能自动使用搜索引擎来查找答案,然后根据搜索结果,给出最终的回答。

环境准备
首先,我们需要安装LangChain以及一些必要的依赖库。我们使用DuckDuckGo作为搜索引擎,因为它不需要申请API Key,非常方便。

# 如果你还没有安装过langchain
pip install langchain langchain-openai# 安装DuckDuckGo搜索工具的依赖
pip install duckduckgo-search
  • langchain: LangChain核心库。
  • langchain-openai: LangChain与OpenAI模型集成的库。为了演示方便,我们这里使用OpenAI,因为它对Agent的支持最成熟。
  • duckduckgo-search: DuckDuckGo搜索引擎的Python包。

获取OpenAI API Key
Agent需要一个足够聪明的LLM来做决策。目前开源模型在这方面还在追赶,OpenAI的GPT系列是效果最好的。你需要:

  1. 访问 OpenAI官网 注册一个账户。
  2. 在个人账户设置中,找到API keys页面,创建一个新的密钥(Secret Key)。
  3. 重要:将你的密钥设置为一个环境变量,以便代码可以安全地读取它。
    • 在Linux或macOS的终端中:export OPENAI_API_KEY="sk-..."
    • 在Windows的CMD中: set OPENAI_API_KEY="sk-..."
    • (注意:每次关闭终端后都需要重新设置,或者将其写入你的shell配置文件如.zshrc.bash_profile中)

完整Python代码
创建一个名为 agent_app.py 的文件,并复制以下代码。

# 1. 导入必要的库
import gradio as gr
from langchain_openai import OpenAI
from langchain.agents import load_tools, initialize_agent, AgentType
import os# 确保你已经设置了环境变量 OPENAI_API_KEY
if "OPENAI_API_KEY" not in os.environ:print("错误:请先设置环境变量 OPENAI_API_KEY")exit()# 2. 初始化LLM(大脑)
# temperature=0 表示我们希望模型尽可能给出基于事实的、确定性的回答
llm = OpenAI(temperature=0)# 3. 加载工具(手臂)
# LangChain内置了很多工具,我们这里加载两个:
# 'ddg-search':DuckDuckGo搜索引擎
# 'llm-math':一个使用LLM来进行数学计算的工具
tools = load_tools(["ddg-search", "llm-math"], llm=llm)# 4. 初始化Agent(指挥官)
# Agent需要三样东西:llm, tools, 和一个agent类型
# ZERO_SHOT_REACT_DESCRIPTION: 这是一种最通用的Agent类型,
# 它通过观察工具的描述来决定在什么时候使用什么工具。
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True # 设置为True,可以在终端看到Agent的思考过程
)# 5. 定义核心的交互函数
def research_chat(query):"""接收用户查询,并由Agent来执行获取答案。"""print(f"用户查询: {query}")# agent.run(query) 是LangChain v0.1.0之前的用法# 在新版本中,推荐使用 agent.invokeresponse = agent.invoke({"input": query})return response["output"]# 6. 创建并启动Gradio界面
demo = gr.Interface(fn=research_chat,inputs=gr.Textbox(lines=2, placeholder="例如: 2023年F1年度总冠军是谁? 或者 345 * 123.4 等于多少?"),outputs="text",title="我的智能研究员Bot",description="这是一个由LangChain驱动的智能代理,它能上网搜索和进行计算。"
)if __name__ == "__main__":demo.launch()

运行与体验

  1. 确保你已设置好OPENAI_API_KEY环境变量。
  2. 在终端运行脚本:python agent_app.py
  3. 在浏览器中打开Gradio提供的本地URL。

见证思考过程
现在,尝试在输入框中问一个它“不可能知道”的问题,比如:“2023年的奥斯卡最佳影片是什么?

提交后,不要只看浏览器界面的最终结果,一定要回到你的终端,你会看到类似下面这样的输出(verbose=True的效果):

> Entering new AgentExecutor chain...I need to find out the winner of the Best Picture award at the 2023 Oscars. I will use a search engine for this.
Action: duckduckgo_search
Action Input: "2023 Academy Awards Best Picture winner"
Observation: The 95th Academy Awards ceremony, presented by the Academy of Motion Picture Arts and Sciences (AMPAS), honored the best films of 2022 and took place on March 12, 2023. ... Everything Everywhere All at Once won seven awards, including Best Picture.
Thought: I have found the answer. The winner was "Everything Everywhere All at Once". I should present this information to the user.
Final Answer: 2023年的奥斯卡最佳影片是《瞬息全宇宙》(Everything Everywhere All at Once)。> Finished chain.

看到这些Thought, Action, Observation了吗?这就是Agent的“内心独白”!

  1. Thought: 它首先思考,认识到自己需要查找信息。
  2. Action: 它决定使用duckduckgo_search工具,并确定了搜索的关键词。
  3. Observation: 这是它从工具(搜索引擎)那里得到的返回结果。
  4. Thought: 它再次思考,发现已经从返回结果中找到了答案。
  5. Final Answer: 它将最终答案组织成流畅的语言,返回给用户。

现在,再试一个数学问题:“目前圆周率的第100位小数是多少?”。它会先尝试用llm-math计算,失败后(因为它算不了这么复杂),可能会转而使用搜索,这就是智能的体现!


3. 总结与预告

本章,我们为囚禁在“玻璃房”中的天才大脑,成功地连接了外部世界。我们不再局限于它静态的知识,而是赋予了它获取新知和执行任务的能力。

本章核心要点

  • LLM的局限:我们理解了标准LLM存在知识截止无法行动两大痛点。
  • LangChain:我们学习了这个强大的框架,它通过链(Chains)的思想,将模型、提示词、工具等组件模块化地组合在一起。
  • 智能代理(Agent):我们掌握了LangChain中最激动人心的概念。Agent是一个能自主思考、决策、并调用工具的智能体,其核心是**ReAct (Reason+Act)**的循环。
  • 实战:我们亲手构建了一个“研究员Bot”,它能根据需要,自动调用搜索引擎和计算器来解决问题,我们还“窥探”了它完整的思考过程。

我们已经学会了如何使用一个强大的、通用的预训练模型,并把它连接到外部工具。但是,如果我们的需求非常特殊和专业呢?比如,我需要一个只回答我公司内部文档的客服机器人,或者一个能理解医学术语的医疗问答AI。通用模型虽然知识渊博,但在这些“私有领域”可能表现不佳。

如何让我们自己的数据,深刻地“注入”到模型中,让它成为一个特定领域的专家?这,就是我们下一章要学习的,大模型应用中另一个极其重要的技术:《创造:Fine-tuning完全指南》。我们将学习如何用自己的数据集,去“微调”一个开源的基础模型,把它定制成我们专属的AI。


4. 课后练习

  1. 探索更多工具LangChain支持非常多的工具。请你尝试阅读LangChain的文档,为我们的Agent再添加一个wikipedia工具。看看当你问一个关于历史人物的问题时,它会优先选择维基百科还是DuckDuckGo。
  2. 定制Agent“性格”initialize_agent函数可以接收一个agent_kwargs参数,你可以在其中定制Agent的“系统提示词”。请尝试修改代码,给Agent设定一个角色,例如:“你是一个言简意赅的AI助手,总是用一句话回答问题。” 观察它的回答风格是否发生了变化。
  3. 思想实验:Agent在决策使用哪个工具时,是依据tools列表中每个工具的description(描述)。如果我们把ddg-search工具的描述改成“一个用来查询食谱的工具”,你认为当用户问天气时会发生什么?这个实验说明了什么在构建Agent时的重要性?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93893.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93893.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/93893.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL 日期处理:深入解析与高效实践

SQL 日期处理&#xff1a;深入解析与高效实践 引言 在数据库管理中&#xff0c;日期和时间数据的处理是不可或缺的一部分。SQL&#xff08;结构化查询语言&#xff09;提供了丰富的日期和时间函数&#xff0c;使得对日期的处理变得既灵活又高效。本文将深入探讨SQL日期处理的相…

源代码部署 LAMP 架构

源代码部署 LAMP 架构 &#xff08;Linux Apache MySQL PHP&#xff09; 一、LAMP 架构概述 LAMP 是一套经典的开源 Web 服务架构&#xff0c;通过源代码安装可实现高度定制化&#xff0c;适用于对软件版本、功能模块有特定需求的场景。本指南基于 CentOS 7 系统&#xf…

GO环境变量中GO111MODULE到底是干啥的?

查看GO111MODULE变量GO111MODULE的作用GO111MODULE的案例演示 一&#xff0c;查看GO111MODULE变量 ]# go env GO111MODULE 或者 ]# go env | grep GO111MODULE二&#xff0c;GO111MODULE的作用 auto : 自动判断机制 当项目位于 $GOPATH/src 目录外且包含 go.mod 文件时&…

在线培训机构如何降低培训视频被盗录的风险

每一节精心录制的培训视频&#xff0c;都凝聚着讲师的心血与机构的巨大投入。然而&#xff0c;只需一个简单的录屏软件&#xff0c;这一切都可能被轻易窃取。一旦被盗取&#xff0c;不但会损失经济利益&#xff0c;还可能会影响机构的声誉。那么&#xff0c;在线培训机构如何降…

Docker:安装配置

目录一、卸载旧版本二、配置Docker的yum库三、安装Docker3.1 在线安装方式3.2 离线安装方式四、配置阿里云镜像加速【选配】五、Docker服务相关命令六、导出和导入镜像官网 一、卸载旧版本 首先如果系统中已经存在旧版本的Docker&#xff0c;则先卸载&#xff1a; yum remov…

RabbitMQ:SpringAMQP 入门案例

目录一、概述二、基础配置三、生产者四、消费者一、概述 这是一篇Java集成RabbitMQ的入门案例&#xff0c;在这里我们做一个小案例&#xff0c;来体会一下RabbitMQ的魅力。 首先我们要做的就是创建一个生产者一个消费者&#xff1a; 生产者直接向RabbitMQ的队列&#xff08;Q…

Ubuntu 下面安装搜狗输入法debug记录

目录0. 整体安装流程1. 在键盘输入法系统中&#xff0c;没有“fcitx”选项解决方法0. 整体安装流程 详细的Ubuntu搜狗输入法安装指南请参考官方教程&#xff1a;Ubuntu搜狗输入法安装指南 1. 在键盘输入法系统中&#xff0c;没有“fcitx”选项 即使是安装完 fcitx&#xff0…

Jenkins+GitLab在CentOS7上的自动化部署方案

最近在安装jenkins实现微服务的自动发布&#xff0c;记录配置过程以免再次踩坑。 Centos7环境准备 jenkins、gitlab配置&#xff0c;全程使用ftpuser普通用户操作 &#xff08;1&#xff09;安装好jdk并配置好环境变量 安装路径/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.…

打开或者安装Navicat时出现Missing required library libcurl.dll,126报错解决方法(libmysql_e.dll等)

提示 Missing required library libcurl.dll 出现原因是由于Navicat安装目录下libcurl.dll可能不能用了&#xff0c;下载该文件放到Navicat安装目录下即可。下载地址&#xff1a;libcurl.dll — download free for Windows 下载解压包里只有个libcurl.dll 提示 Missing requir…

基于SpringBoot的流浪动物领养管理系统【2026最新】

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

Qt实现TabWidget通过addTab函数添加的页,页内控件自适应窗口大小

前言&#xff1a;因为项目的要求&#xff0c;需要把几个不同类型功能的界面集成在同一个窗口中&#xff0c;方便用户不切换窗口&#xff0c;也能快捷的操作不同类型的功能。我首先想到的是通过选项卡方式&#xff0c;让几个类别的功能界面通过不同选项卡进行切换&#xff0c;这…

代码随想录算法训练营27天 | ​​56. 合并区间、738.单调递增的数字、968.监控二叉树(提高)

题目链接&#xff1a;56. 合并区间、738.单调递增的数字、968.监控二叉树 文章链接&#xff1a;代码随想录 贪心算法 1. 合并区间 &#xff08;待更新...&#xff09; class Solution { private:static bool cmp(const vector<int>& a, const vector<int>&…

从 H.264/H.265 到 H.266:RTSP播放器的跨代际演进

引言&#xff1a;H.266与实时视频的交汇点 视频编解码的发展历程&#xff0c;始终是 带宽效率与视觉体验的博弈。从 H.264 的普及&#xff0c;到 H.265/HEVC 的深化应用&#xff0c;每一次标准迭代&#xff0c;都在推动视频向更高分辨率、更高帧率、更复杂场景的应用迈进。而 …

oc-mirror plugin v2 错误could not establish the destination for the release i

openshift 4.19使用的镜像仓库为harbor. 运行disk to registry时出现下面的错误&#xff1a; 2025/08/19 17:51:13 [ERROR] : [Executor] [release collector] could not establish the destination for the release image 备注&#xff1a; 我没有账户&#xff0c;无法打开…

Android auncher3实现简单的负一屏功能

Android launcher3实现简单的负一屏功能 1.前言&#xff1a; 之前实现过Launcher3从凑提修改成单层&#xff0c;今天来讲解一下如何实现一个简单的负一屏功能&#xff0c;涉及的类如下&#xff0c;直接看代码。 2.NegativeScreenAdapter&#xff1a; package com.example.ne…

跨网闸数据库同步:在物理隔离中架起安全的数据桥梁

作者:DeepSeek-R1 | 日期:2025年8月17日 引言 在等保2.0和分级保护政策的要求下,高密级网络(如政务内网、金融核心网)必须与低密级网络(如互联网)物理隔离。但业务又要求数据跨网流动(如市民在线提交申请、分支机构数据回传)。如何解决这一矛盾?双向网闸与单向光闸成…

【Android】一文详解Android里的AOP编程

一文详解Android里的AOP编程 1. 基于 AspectJ&#xff08;编译期/打包期织入&#xff09; 思路&#xff1a;用 AspectJ 编译器在 编译阶段 或 Gradle Transform 阶段&#xff0c;把切面逻辑织入 class / bytecode。 特点&#xff1a; 能实现类似 Spring AOP 的注解切面&#…

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年8月21日第167弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀4-5个和值&#xff0c;可以做到100-300注左右。(1)定位…

机器学习【十】neural network

系统梳理了机器学习与神经网络的基础知识&#xff0c;涵盖理论、核心概念及代码实践。理论部分包括线性模型&#xff08;向量表示、广义线性模型&#xff09;、分类与回归的区别、梯度下降&#xff08;批量/随机/小批量&#xff09;、激活函数&#xff08;Sigmoid、ReLU等&…

如何用算力魔方4060安装PaddleOCR MCP 服务器

在当今数字化快速发展的时代&#xff0c;OCR&#xff08;光学字符识别&#xff09;技术已经成为从图像中提取文本信息的重要工具。无论是在自动化办公、智能文档处理还是在内容创作领域&#xff0c;OCR 技术的应用都极大地提高了工作效率和准确性。本文将详细介绍如何利用算力魔…