AI工具链与代理:从LangChain到Semantic Kernel的深度解析

一、引言

在人工智能的蓬勃发展中,大型语言模型(LLM)展现出了惊人的语言理解与生成能力,宛如拥有百科全书般知识的 “超级大脑”,能够流畅地与人交流,处理各种文本任务。然而,LLM 若仅依赖其训练数据,就如同被束缚在知识的孤岛,无法触及瞬息万变的真实世界,难以查询最新数据,也无力执行具体操作。

此时,“工具” 在 AI 世界中宛如神奇的魔术师,发挥着不可或缺的关键作用。在当下主流的 AI 框架,如 LangChain、LlamaIndex 和 Semantic Kernel 中,“工具” 成为了连接 LLM 与外部世界的核心枢纽。它们赋予 LLM “手脚”,使其从单纯的信息 “消费者”,转变为能够主动探索、获取、处理乃至创造的 “行动者”,进而为 AI 在现实世界的广泛应用解锁了无限潜力。

本文将引领读者深入探索这些 AI 框架中 “工具” 的神秘面纱,从基础概念到如何亲手打造自定义工具,再到将多个工具巧妙编织成强大的 “工具链”,以及赋予 LLM 自主决策能力的 “代理” 机制。同时,通过一系列生动且实用的真实案例,揭示如何将天气预报、金融数据、智能家居控制等丰富的现实功能融入 AI 应用,让 AI 真正 “活” 起来,走进人们的生活与工作。让我们一同踏上这场充满惊喜与发现的 AI 工具探索之旅!

二、AI 框架中的 “工具” 概念与工作原理

在 AI 的奇幻领域中,“工具” 绝非传统意义上的实物工具,而是一种功能强大的抽象概念。它是封装了特定功能的函数、API 接口或其他可执行代码,如同为 LLM 配备的超能力装备,助力其冲破自身训练数据的藩篱,去完成诸多看似 “不可能的任务”。

其工作原理恰似一场编排精妙的舞蹈:

  1. 意图识别

    :LLM 首先要精准 “听懂” 用户的请求,深入理解用户的意图,判断该任务是否需要外部力量的协助。例如,当用户询问 “北京明天的天气如何?”,LLM 能明确这涉及到获取实时天气信息,需要借助相关工具。

  2. 工具选择

    :若判定需要外部支持,LLM 便如同经验丰富的指挥家,迅速从其知晓的众多 “工具库” 中,挑选出最为契合的工具。比如,面对天气查询需求,它可能选择天气查询 API 工具;若用户需要计算复杂数学问题,可能选择数学计算工具。

  3. 参数提取

    :随后,LLM 会从用户请求中精准无误地 “抓取” 执行工具所需的关键信息。如在天气查询中,准确提取出城市名称 “北京”;数学计算时,提取出具体的数字和运算符号等参数。

  4. 工具执行

    :AI 框架接过 LLM 传递的参数,如同忠诚的助手,代替 LLM 去实际 “操作” 选定的工具,调用相应的函数、发起 API 请求等。

  5. 结果返回

    :工具高效完成任务后,会及时将结果 “汇报” 给 LLM。例如,天气查询工具返回北京明天的天气详情,包括温度、天气状况等信息。

  6. 整合与响应

    :LLM 将新获取的工具执行结果,与自身已有的丰富知识深度融合,经过综合分析与处理,最终为用户提供一个完整、准确且满意的答复。

三、主流 AI 框架内置工具的详细用法

主流 AI 框架贴心地为开发者准备了丰富多样的内置工具,宛如为 LLM 配备了一套 “开箱即用” 的超级工具箱,极大地提升了开发效率与应用功能。

3.1 LangChain:多才多艺的工具集合

LangChain 将工具视为可执行特定操作的函数,其内置工具涵盖了多个领域,功能十分强大:

  • llm - math

    :专为解决各类数学难题而设计,无论是简单的四则运算,还是复杂的高等数学计算,都能轻松应对。

  • Web Search

    :让 LLM 能够便捷地在互联网的信息海洋中冲浪,快速获取最新的资讯、知识,满足用户对实时信息的需求。

  • Wikipedia

    :宛如随身携带的维基百科知识库,用户可随时查阅各类百科知识,获取权威、全面的信息。

  • 文件系统工具

    :如ReadFileToolWriteFileTool,赋予 LLM 读写本地文件的能力,方便其处理本地存储的数据,例如读取文档内容进行分析,或者将生成的结果写入文件保存。

  • 数据库工具

    :使 LLM 能够与 SQL 数据库进行流畅交互,实现数据的查询、插入、更新等操作,例如从数据库中检索特定数据用于分析,或者将处理后的数据存入数据库。

在使用 LangChain 的内置工具时,通常只需简单几步:首先导入所需工具,然后将其封装成Tool对象,最后将该对象交给代理即可。例如,使用llm - math工具进行数学计算:

from langchain.tools import Tool, BaseTool
from langchain.utilities import ArithmeticCalculator
# 初始化数学计算工具
calculator = ArithmeticCalculator()
# 封装成Tool对象
math_tool = Tool(
    name="Calculator",
    func=calculator.run,
    description="Useful for when you need to perform arithmetic calculations. Input should be a valid arithmetic expression."
)

3.2 LlamaIndex:以数据为中心的工具库

LlamaIndex 的工具紧密围绕其数据查询核心功能,主要服务于 LLM 与各种数据源的高效交互:

  • QueryEngineTool

    :具备强大的功能,能够将任何查询引擎封装成工具,使 LLM 能够像专业人士一样,针对特定数据源精准提问,获取有价值的信息。例如,将企业内部数据库的查询引擎封装,让 LLM 能快速查询企业数据。

  • FunctionTool

    :灵活性极高,可将任意 Python 函数轻松转化为工具,为开发者提供了极大的便利,能够根据具体需求定制各种功能独特的工具。

  • PydanticTool

    :基于 Pydantic 模型定义工具参数,具有强大的类型安全和结构化能力。这确保了数据在传输和处理过程中的规范性和准确性,有效避免因数据类型不匹配等问题导致的错误。

  • Web Search Tools

    :无缝对接 DuckDuckGo 或 Google Search 等知名搜索引擎,让 LLM 能够迅速获取互联网上的海量信息,为用户提供全面、及时的知识服务。

  • SQL Tools

    :专门用于与 SQL 数据库进行交互,方便 LLM 对数据库中的数据进行查询、分析等操作,助力企业数据处理和决策分析。

使用 LlamaIndex 工具时,以FunctionTool为例,假设我们有一个自定义的 Python 函数get_stock_price用于获取股票价格:


 

from llama_index.core.tools import FunctionTool
def get_stock_price(stock_symbol):
    # 实际获取股票价格的逻辑,这里省略
    return f"The price of {stock_symbol} is $100"
stock_tool = FunctionTool.from_defaults(
    fn=get_stock_price,
    description="Get the current price of a stock. Input should be the stock symbol."
)

3.3 Semantic Kernel:技能与插件的哲学

Semantic Kernel 通过 “技能”(Skills)和 “插件”(Plugins)来构建工具体系。一个插件可包含一个或多个 “函数”,每个函数即为一个工具,其涵盖的工具类型丰富:

  • WebSearchSkill

    :赋予 LLM 强大的网页搜索能力,使其能够在互联网上快速检索所需信息,满足用户对各种知识的查询需求。

  • FileIOSkill

    :专注于处理文件操作,包括文件的读取、写入、删除等常见功能,方便 LLM 对本地文件进行管理和处理。

  • MathSkill

    :提供全面的数学计算功能,从基础运算到复杂的数学函数计算,为涉及数学运算的任务提供支持。

  • TimeSkill

    :能够获取当前时间等时间相关信息,在需要时间信息的场景中发挥重要作用,例如日程安排、时间提醒等应用。

这些工具通常通过 C# 或 Python 代码实现,并使用@kernel_function等属性进行标记,以便 Semantic Kernel 能够准确识别和调用。以 Python 实现的WebSearchSkill为例:

from semantic_kernel.functions import kernel_function
import requests
class WebSearchPlugin:
    @kernel_function(
        name="WebSearch",
        description="Search the web for information. Input should be the search query.",
        parameters=[
            {"name": "query", "description": "The search query.", "type": "string", "is_required": True}
        ]
    )
    def web_search(self, query: str) -> str:
        # 实际的网页搜索逻辑,这里使用简单示例
        response = requests.get(f"https://www.example.com/search?q={query}")
        return response.text


 

四、将任意第三方 API 封装为 AI 模型可调用的工具

将第三方 API 封装成工具,犹如为 LLM 安装了一对万能翅膀,使其能够自由调用各种在线服务,极大地拓展了其功能边界。这一过程需要为 API 精心打造一个 “转接头”,确保其符合 AI 框架对工具的要求。

4.1 通用封装步骤

  1. 选择 API

    :首先要明确目标,确定你想要封装的第三方 API,并深入了解其核心功能、接口地址、请求方式(如 GET、POST 等)以及所需参数。例如,若要封装天气查询 API,需清楚其提供的天气数据类型、接口 URL,以及是通过城市名称还是经纬度作为查询参数等。

  2. 定义工具签名

    :这是至关重要的一步,如同为 LLM 撰写一份详细的 “说明书”:

    • 工具名称

      :应简洁明了且具有高度描述性,让 LLM 能够一看便知工具的主要功能。例如,“WeatherQueryTool” 直观地表明这是一个用于天气查询的工具。

    • 工具描述

      :详细阐述工具的具体功能,以及在何种情况下适合使用该工具。例如,“该工具用于查询全球任意城市的实时天气状况,包括温度、湿度、天气现象等信息。当用户询问与当前天气相关问题时可使用。” 这能帮助 LLM 准确判断是否调用此工具。

    • 输入参数

      :清晰定义 API 所需的输入参数,包括参数名称、类型、详细描述以及是否为必需参数。通常采用 JSON Schema 或 Pydantic 模型来规范参数格式,确保数据的准确性和一致性。例如,对于天气查询工具,输入参数可能定义为:

from pydantic import BaseModel, Field
class WeatherQueryInput(BaseModel):    
    city: str = Field(description="The name of the city to query the weather for.")

返回值

:明确告知 LLM 该工具可能返回的数据类型和大致结构。例如,天气查询工具可能返回:

​​​​​​​

class WeatherQueryOutput(BaseModel):
    temperature: float = Field(description="The current temperature in Celsius.")
    humidity: int = Field(description="The relative humidity percentage.")
    weather_condition: str = Field(description="The current weather condition, e.g., sunny, cloudy.")


 

  1. 实现工具执行逻辑

    :编写具体代码来实际调用第三方 API。这通常涉及构建符合 API 要求的 HTTP 请求,妥善处理 API 认证(如 API 密钥、OAuth 等),发送请求并准确解析响应数据。同时,要将原始 API 返回的数据转换为 LLM 易于理解和处理的格式。例如,使用 Python 的requests库调用天气 API:

import requests
from typing import Optional
def get_current_weather(city: str) -> Optional[WeatherQueryOutput]:
    api_key = "YOUR_API_KEY"
    url = f"https://api.weather.com/weather?city={city}&apikey={api_key}"
    response = requests.get(url)
    if response.status_code == 200:
        data = response.json()
        temperature = data.get('temperature')
        humidity = data.get('humidity')
        weather_condition = data.get('weather_condition')
        return WeatherQueryOutput(
            temperature=temperature,
            humidity=humidity,
            weather_condition=weather_condition
        )
    else:
        return None

  1. 集成到 AI 框架

    :根据不同 AI 框架的特定要求,将实现好的工具逻辑注册为框架可识别和调用的工具。

4.2 框架特定的集成方式

  • LangChain

    :可以使用Tool类轻松封装一个 Python 函数。以天气查询为例:

from langchain.tools import Tool
weather_tool = Tool(
    name="GetCurrentWeather",
    func=get_current_weather,
    description="Query the current weather condition of a specified city. Input should be the city name."
)
# 接着,将weather_tool加入到你的代理工具列表中

​​​​​​

更为高级的用法是,可直接从 OpenAPI 规范创建工具,通过解析 OpenAPI 文档自动生成工具定义和执行逻辑,进一步简化开发流程。

  • LlamaIndex

    :利用FunctionTool封装 Python 函数,或者借助PydanticTool提供更严格、规范的参数定义。LlamaIndex 还支持通过OpenAPIToolAPISpecTool从 OpenAPI 规范直接创建工具。例如:

from llama_index.core.tools import FunctionTool
weather_tool = FunctionTool.from_defaults(
    fn=get_current_weather,
    description="Query the current weather condition of a specified city. Input should be the city name."
)
# 将weather_tool传递给LlamaIndex代理
  • Semantic Kernel

    :通常通过创建自定义 “插件” 来实现。一个插件是一个包含多个方法的类,每个方法使用@kernel_function装饰器进行标记,在方法内部实现 API 调用的具体逻辑。例如:

from semantic_kernel.functions import kernel_function
import requests
class WeatherPlugin:
    @kernel_function(
        name="GetCurrentWeather",
        description="Query the current weather condition of a specified city.",
        parameters=[
            {"name": "city", "description": "The name of the city to query the weather for.", "type": "string", "is_required": True}
        ]
    )
    def get_current_weather(self, city: str) -> str:
        # 实际调用API的逻辑
        api_key = "YOUR_API_KEY"
        url = f"https://api.weather.com/weather?city={city}&apikey={api_key}"
        response = requests.get(url)
        if response.status_code == 200:
            data = response.json()
            return f"The weather in {city} is {data.get('weather_condition')}, temperature is {data.get('temperature')}."
        else:
            return "Failed to get weather information."
# 将插件添加到Kernel
# kernel.add_plugin(WeatherPlugin(), plugin_name="WeatherPlugin")

​​​​​​​


 

五、自定义工具开发最佳实践和设计模式

打造自定义工具如同精心雕琢一件艺术品,需遵循一系列 “黄金法则”,方能使其具备强大的功能、高度的可靠性且易于使用。

  1. 清晰的工具定义

    :工具的名称应直观反映其功能,做到见名知意。描述要详尽、具体,精确阐述工具的作用及适用场景。输入参数的定义务必清晰明确,最好借助 JSON Schema 或 Pydantic 模型进行结构化处理,确保数据格式的严谨性和规范性。例如,一个用于图片处理的工具,名称可定义为 “ImageResizerTool”,描述为 “该工具用于调整图片的尺寸大小。输入参数需包含原始图片路径、目标宽度和目标高度,均为必填项。”

  2. 单一职责原则

    :秉持一个工具专注做好一件事的理念。如同瑞士军刀的各个部件,每个工具都应有明确、单一的功能,避免设计成功能繁杂但效果不佳的 “大杂烩”。这样的设计使工具更易于理解、测试和复用。例如,一个工具专门负责文本翻译,另一个工具专注于文本摘要生成,各自独立且功能强大。

  3. 模块化和可重用性

    :将工具实现为独立的模块或类,便于在不同项目或不同代理中重复使用,有效避免重复开发。例如,将文件读取工具封装成一个独立的模块,在多个需要读取文件的 AI 应用中都可直接调用,提高开发效率。

  4. 错误处理和鲁棒性

    :现实世界充满不确定性,工具必须具备强大的错误处理能力。能够优雅应对网络中断、API 调用失败、无效输入等各种异常情况。当出现问题时,应返回详细、有价值的错误信息给 LLM,而非导致整个系统崩溃。例如,在调用 API 失败时,工具可返回错误代码和具体错误描述,如 “API 调用失败,错误代码 404,原因是请求的资源未找到”,以便 LLM 进行后续处理。

  5. 详细的日志和可观测性

    :在工具执行过程中记录详尽的日志,如同为 AI 应用安装 “黑匣子”,便于追踪、调试和优化。借助 LangChain 的 LangSmith 等工具,可方便地记录工具的调用历史、输入输出参数、执行时间等信息,帮助开发者深入了解工具的运行情况,及时发现并解决问题。

  6. 异步支持

    :若工具执行的任务耗时较长,如调用远程 API,应考虑提供异步接口,避免阻塞主线程,确保 AI 应用运行流畅。例如,使用 Python 的asyncio库实现异步调用,提高系统的并发处理能力和响应速度。

六、多个工具的组合:工具链与代理

当 AI 面临复杂任务时,单一工具往往力不从心。此时,如同交响乐团需指挥家协调众多乐手共同演奏,在 AI 框架中,组合多个工具成为完成复杂任务的关键,主要模式有 “工具链” 和 “代理”。

六、多个工具的组合:工具链与代理

当 AI 需要完成更复杂的任务时,仅仅使用单个工具是远远不够的。就像一支交响乐团,每个乐手(工具)都擅长演奏自己的乐器,但只有通过指挥家(LLM 或预设流程)的协调,才能奏出动人的乐章。在 AI 框架中,组合多个工具主要有两种模式:“工具链” 和 “代理”。

6.1 工具链 (Tool Chaining)

概念

工具链类似装配线,工具按照预先设定的固定顺序依次工作,前一个工具的输出作为下一个工具的输入。这种模式高度适配步骤明确、流程固定的任务,比如 “抓取网页内容→提取关键信息→生成摘要报告” 这类有清晰先后逻辑的操作。

工作原理

开发者如同工程师,提前规划好每一步的执行流程。LLM 可能在链中某个环节发挥作用(比如生成中间文本、处理输出格式),但整个流程的 “骨架” 是刚性的 —— 不会因为任务细节变化而调整工具调用顺序。

典型示例

LangChain 的Chain概念是工具链的经典实现。例如用SimpleSequentialChain可将多个工具按顺序串联,前一个工具的输出直接传递给下一个。而 LangChain Expression Language (LCEL) 进一步降低了使用门槛,支持像搭乐高一样组合工具,还能实现并行执行、错误回退等高级功能。
比如 “股票数据查询→数据可视化→生成分析报告” 的工具链:先用YahooFinanceTool获取某只股票的历史数据,再用MatplotlibTool生成 K 线图,最后用ReportGenerationTool基于数据和图表撰写分析报告,整个流程无需 LLM 额外决策,按预设顺序自动执行。

优点
  • 可预测性强

    :执行流程一目了然,开发者能清晰预判每一步输出,调试和定位问题更高效。

  • 实现简单

    :无需复杂的决策逻辑,只需按任务步骤排列工具,适合快速搭建固定流程的自动化任务。

  • 资源消耗低

    :减少不必要的 LLM 调用(仅在必要环节使用),运行速度更快,成本更低。

缺点
  • 灵活性不足

    :无法应对动态变化的需求,比如用户突然要求增加 “与同行业股票对比” 的步骤,工具链无法自动调整。

  • 不支持复杂决策

    :若任务需要根据中间结果判断下一步操作(如 “若查询到数据异常,需重新验证数据源”),工具链会因流程固定而无法实现。

6.2 代理 (Agents)

概念

代理是 AI 真正的 “智能大脑”——LLM 不再是简单的工具执行者,而是像侦探或项目经理一样,能自主思考、规划步骤,并根据实时反馈动态选择工具。例如用户提出 “分析某公司近 3 年财务数据并判断是否值得投资”,代理会先决定调用 “财务数据查询工具” 获取数据,再用 “数据分析工具” 计算关键指标,最后用 “投资评估工具” 生成结论,整个过程无需开发者预设流程。

工作原理

代理遵循 “思考 - 行动 - 观察”(Thought-Action-Observation)的循环逻辑:

  1. 思考

    :LLM 分析用户需求和当前状态(如是否已有数据、是否需要补充信息),明确下一步目标。

  2. 行动

    :根据思考结果选择合适的工具,并提取正确参数(如 “调用财务数据工具,参数为‘某公司 + 2021-2023 年’”)。

  3. 观察

    :执行工具后,获取输出结果并判断是否符合预期 —— 若数据完整,继续下一步;若数据缺失,返回 “思考” 环节重新选择工具(如调用 “数据源验证工具” 确认数据准确性)。

  4. 循环

    :重复上述步骤,直到完成任务并生成最终回复。

典型示例

LangChain 的 Agent 模块是动态决策的代表,支持根据任务复杂度自动选择工具;而 LangGraph 更进一步,用图结构定义代理的工作流,支持循环(如 “数据异常时重新查询”)、分支(如 “若利润率上升,调用 A 工具;若下降,调用 B 工具”)等复杂逻辑。
LlamaIndex 的 Workflows、Semantic Kernel 的 Agent Framework 也有类似能力,例如 Semantic Kernel 的代理可根据用户指令,自动调用 “日历工具” 确认时间、“邮件工具” 发送会议邀请、“文档工具” 生成会议议程,全程自主协调多个工具。

优点
  • 灵活性极强

    :能应对非结构化、动态变化的任务,比如 “帮我整理本周重要新闻并生成思维导图”,代理会根据新闻内容调整工具调用顺序(如先抓取新闻、再分类、最后生成导图)。

  • 自主性高

    :LLM 可独立完成多步推理,减少人工干预,尤其适合复杂问题(如科研文献分析、市场调研)。

  • 能处理不确定性

    :面对 “数据缺失”“工具调用失败” 等突发情况,代理会自主调整策略(如更换数据源、重试工具),而不是直接报错。

缺点
  • 复杂度高

    :设计代理需考虑决策逻辑、错误处理、反馈机制等,比工具链更难开发和调试。

  • 可预测性低

    :由于动态决策,代理可能出现 “非预期操作”(如重复调用同一工具),需要额外的监控和约束机制。

  • 成本较高

    :每轮 “思考 - 行动” 都需调用 LLM,复杂任务可能涉及十几次甚至几十次调用,计算成本显著高于工具链。

6.3 工具链与代理的对比

特征

工具链 (Tool Chaining)

代理 (Agents)

控制流

预定义固定顺序,无法动态调整

LLM 实时决策,根据反馈灵活调整

实现难度

低,只需排列工具顺序

高,需设计推理逻辑和反馈机制

适用场景

固定流程任务(如数据提取、固定报告生成)

复杂动态任务(如市场调研、科研分析)

LLM 依赖度

低,仅在必要环节使用

高,每步决策都需调用 LLM

调试难度

易,流程透明,可逐步定位问题

难,动态决策导致行为不可预测

资源消耗

低(少 LLM 调用)

高(多 LLM 调用)

如何选择?
  • 选工具链

    :若任务步骤清晰、无需调整(如 “每日 9 点抓取天气数据并发送短信”),工具链是高效低成本的选择。

  • 选代理

    :若任务复杂、需求多变(如 “帮我分析某行业趋势并生成 PPT”),代理能自主协调工具,减少人工干预。

  • 最佳实践

    :两者结合 —— 让代理拥有调用工具链的能力。例如,代理在处理 “年度财务总结” 任务时,可先调用 “数据采集 - 分析 - 报告” 工具链生成初稿,再用 “文档优化工具” 调整格式,既保证流程效率,又兼顾灵活性。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值