介绍
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) # 输出代理返回的结果
效果演示
可以看到已经成功调用了工具,剩下的使用大家就自由发挥了,演示的工具我是写死的,实际应用大家可以自定义实现。
总结
通过本文,我们学习了如何使用 LangChain 中的 Tool 功能来创建自定义工具,以获取天气和时间信息。通过定义工具函数、创建工具列表、设置提示模板和输出解析器,我们能够初步构建一个能够与用户进行交互的智能代理,为进一步开发更复杂的智能应用提供了思路和方法。
如何零基础入门 / 学习AI大模型?
大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?
”“谁的饭碗又将不保了?
”等问题热议不断。
不如成为「掌握AI工具的技术人」
,毕竟AI时代,谁先尝试,谁就能占得先机!
想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。
但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高
那么我作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,希望可以帮助到更多学习大模型的人!至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费
】
👉 福利来袭
优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈
全套AGI大模型学习大纲+路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!
640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
👉 福利来袭
优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈
这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费
】
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。