介绍

LangChain 是一个强大的框架,旨在帮助开发者构建基于语言模型的应用程序。在这个教程中,我们将深入探讨如何使用 LangChain 中的 Tool 功能,创建自定义工具以获取天气和时间信息。

文末赋完整代码!扫描下方二维码免费领取

环境准备

在开始之前,请确保您已经安装了 LangChain 及其依赖项。您可以使用以下命令进行安装:

pip install langchain

代码结构

我们将通过一个 Jupyter Notebook 来演示如何使用 LangChain 中的 Tool。以下是代码的主要结构:

1. 导入必要的库

首先,我们需要导入 LangChain 中的相关模块和 Python 的标准库:

from langchain.agents import Tool, AgentExecutor, LLMSingleActionAgent
from langchain.prompts import StringPromptTemplate
from langchain import OpenAI, LLMChain
from typing import List, Union
from langchain_community.llms import Ollama 
from langchain.schema import AgentAction, AgentFinish
import re
from langchain.agents import AgentOutputParser
from langchain_core.output_parsers import StrOutputParser

2. 定义工具函数

接下来,我们定义两个简单的工具函数:一个用于获取天气信息,另一个用于获取当前时间。

def get_weather(location: str) -> str:
    """获取指定位置的天气信息"""
    return f"{location}的天气晴朗,温度25度"

def get_time(timezone: str) -> str:
    """获取指定时区的当前时间"""
    return f"{timezone}的当前时间是下午3点"

3. 创建工具列表

我们将创建一个工具列表,其中包含我们刚刚定义的工具:

tools = [
    Tool(
        name="Weather",  # 工具的名称为 "Weather"
        func=get_weather,  # 关联的函数是 get_weather,用于获取天气信息
        description="用于获取指定位置的天气信息"  # 工具的描述,供LLM理解何时调用该工具
    ),
    Tool(
        name="Time",  # 工具的名称为 "Time"
        func=get_time,  # 关联的函数是 get_time,用于获取当前时间
        description="用于获取指定时区的当前时间"  # 工具的描述,供LLM理解何时调用该工具
    )
]

  • description字段会直接影响大语言模型选择工具的准确率
4. 创建提示模板

我们需要一个自定义的提示模板,以便在与用户交互时使用:
在这里插入图片描述在这里插入图片描述

from typing importList
from langchain.prompts import StringPromptTemplate
from langchain.tools import Tool

classCustomPromptTemplate(StringPromptTemplate):
    tools: List[Tool]

    defformat(self, **kwargs) -> str:
        # 步骤1:提取中间步骤记录
        intermediate_steps = kwargs.pop("intermediate_steps")

        # 步骤2:构建历史行动轨迹
        thoughts = ""
        for action, observation in intermediate_steps:
            thoughts += f"\n行动: {action}\n观察: {observation}"

        # 步骤3:生成工具描述列表
        tools_str = "\n".join([f"{tool.name}: {tool.description}"for tool inself.tools])

        # 组装完整提示模板
        return f"""请严格按照以下格式回答用户问题。

可用工具:
{tools_str}

必须严格按照如下格式回复:
思考: 分析需要做什么
行动: <工具名> <参数>
观察: <工具返回的结果>
... (可以重复思考/行动/观察步骤)
回答: 根据观察给出最终答案

之前的行动:{thoughts}

人类: {kwargs["input"]}
思考:"""

说明:

intermediate_steps = kwargs.pop(“intermediate_steps”)

存储的是调用Tool返回的结果,如:

[(AgentAction(tool='Weather', tool_input='{"location": "北京"}', log='思考: 需要获取北京当前的天气信息。\n行动: Weather {"location": "北京"}'), '{"location": "北京"}的天气晴朗,温度25度')]

kwargs.pop 获取之后回移出。

5. 创建输出解析器

输出解析器用于解析模型的输出,确保我们能够正确处理模型的响应:

class CustomOutputParser(AgentOutputParser):
    defparse(self, text: str) -> Union[AgentAction, AgentFinish]:
      
        if"回答:"in text or"回答:"in text:
            answer = text.split("回答:")[-1].split("回答:")[-1].strip()
            return AgentFinish(
                return_values={"output": answer},
                log=text
            )
        
        action_match = re.search(r"行动[::]\s*(.*?)(?:\n|$)", text)
        ifnot action_match:
            print(f"DEBUG - 收到的文本: {text}")
            if"思考:"in text or"思考:"in text:
                raise ValueError("模型正在思考,但尚未给出行动步骤")
            else:
                raise ValueError("无法识别输出格式,需要'行动'或'回答'")
        
        action = action_match.group(1).strip()
        parts = action.split()
        iflen(parts) < 2:
            raise ValueError(f"行动格式错误,需要'工具名 参数'格式: {action}")
            
        tool_name = parts[0]
        tool_input = " ".join(parts[1:])
        
        return AgentAction(tool=tool_name, tool_input=tool_input, log=text)

    @property
    def_type(self) -> str:
        return "custom"

这里主要根据大模型返回的结果进行判断下一步该走什么流程,这里的逻辑自己可以优化,我这里只是一个 Demo,比如:

  • • 代码检查文本中是否包含“回答:”或“回答:”,如果找到这些标识符,表示模型已经完成任务并给出了最终答案。此时,提取答案并返回一个 AgentFinish 对象,表示任务完成。
  • • 如果没有找到最终回答,代码会使用正则表达式查找“行动:”或“行动:”后面的内容。如果未找到行动步骤,打印调试信息,并根据文本内容判断是否抛出错误。

说明:

  • • AgentAction: 表示代理需要执行的具体行动,包含工具名称、输入参数和日志信息。(通过他可以完成多次 LLM 调用)
  • • AgentFinish: 表示代理完成任务的状态,包含最终返回的结果和日志信息。
6. 设置 Agent

我们将初始化一个语言模型(LLM)并创建一个 Agent:

# 初始化Ollama模型配置
llm = Ollama(
    model="qwen2.5:7b",  # 指定要使用的模型名称
    base_url="${Ollama地址}"# 设置API端点的地址,使用环境变量或配置文件中的地址
)

# 创建自定义提示模板
prompt = CustomPromptTemplate(
    template="",  # 提示模板的内容,这里为空字符串,在使用中动态生成
    tools=tools,  # 将之前定义的工具列表传入模板
    input_variables=["input", "intermediate_steps"]  # 定义输入变量,包含用户输入和中间步骤
)

# 创建输出解析器实例
output_parser = CustomOutputParser()  # 实例化自定义输出解析器,用于解析模型的输出

# 创建LLM链,结合模型和提示模板
llm_chain = LLMChain(llm=llm, prompt=prompt)  # 将Ollama模型和提示模板组合成一个链

# 创建单一行动代理
agent = LLMSingleActionAgent(
    llm_chain=llm_chain,  # 将LLM链传入代理
    output_parser=output_parser,  # 设置输出解析器
    stop=["\n观察:"],  # 定义停止标记,当模型输出包含此标记时停止生成
    allowed_tools=[tool.name for tool in tools]  # 允许代理使用的工具列表
)

7. 创建 Agent 执行器

最后,我们创建一个 Agent 执行器,并在主程序中运行它:

# 创建Agent执行器,结合代理和工具
agent_executor = AgentExecutor.from_agent_and_tools(
    agent=agent,  # 将之前创建的代理实例传入
    tools=tools,  # 传入可用的工具列表
    verbose=True# 设置为True以启用详细输出,便于调试和观察执行过程
)

# 主程序入口
if __name__ == "__main__":
    # 运行代理执行器,传入用户查询的内容
    result = agent_executor.run("北京的天气怎么样?")  # 执行代理,询问北京的天气情况
    # 打印最终结果
    print("最终结果:", result)  # 输出代理返回的结果
    
    result = agent_executor.run("北京现在几点")
    # 打印最终结果
    print("最终结果:", result)  # 输出代理返回的结果

效果演示

可以看到已经成功调用了工具,剩下的使用大家就自由发挥了,演示的工具我是写死的,实际应用大家可以自定义实现。

image-20250221172210105

总结

通过本文,我们学习了如何使用 LangChain 中的 Tool 功能来创建自定义工具,以获取天气和时间信息。通过定义工具函数、创建工具列表、设置提示模板和输出解析器,我们能够初步构建一个能够与用户进行交互的智能代理,为进一步开发更复杂的智能应用提供了思路和方法。

如何学习AI大模型?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高

那么针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈

学习路线

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐