19.langchain 入门到放弃(八)tools-CustomTools
工具是代理、链或 LLM 用来与世界交互的界面。它们包含以下几个方面:
1、工具名称
2、工具描述
3、工具输入的 JSON 模式
4、要调用的函数
5、工具的结果是否应直接返回给用户
掌握所有这些信息非常有用,因为这些信息可用于构建行动执行系统!名称、描述和 JSON 模式可用于提示 LLM,使其知道如何指定要采取的行动,然后调用的函数就相当于采取该行动。
工具的输入越简单,LLM 使用起来就越容易。许多代理只能使用单字符串输入的工具。
重要的是,名称、描述和 JSON 模式(如果使用)都会在提示中使用。因此,这三者必须清晰明确地描述工具的使用方法。如果 LLM 不明白如何使用工具,可能需要更改默认名称、描述或 JSON 模式。
自定义工具
-
name (str), 是必需的,而且必须在提供给代理的一套工具中是唯一的 -
description (str), 是可选的,但推荐使用,因为它被代理用来确定工具的使用情况 -
args_schema (Pydantic BaseModel), 是可选的,但推荐使用,可用于提供更多信息(如少量示例)或验证预期参数。
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_community.llms.ollama import Ollama
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.tools import tool
import dns.resolver
# 注意此处对应的模型不支持funtion call
llm = Ollama(base_url="http://localhost:11434", model="llama3")
@tool
def digDomain(domain: str, nameServer: str, recordType: str) -> str:
"""域名拨测工具.参数为
domain 域名
nameserver dns服务器
recordType dns记录类型"""
print("开始调用digDomain函数")
# 创建DNS解析器对象
resolver = dns.resolver.Resolver()
resolver.nameservers = [nameServer]
resolver.port = 53
try:
# 进行DNS查询并获取响应结果
answer = resolver.resolve(qname=domain, rdtype=recordType)
# 打印查询结果
for rdata in answer:
return f'{domain} 的IP地址是: {rdata.address}'
except dns.exception.DNSException as e:
print(f'DNS查询失败: {e}')
tools = [digDomain]
prompt = ChatPromptTemplate.from_messages(
[
("system", "你在dns领域有着资深经验,对于DNS协议尤为精通,关于域名解析等方面"),
("human", "{input}"),
MessagesPlaceholder("agent_scratchpad"),
]
)
agent = create_tool_calling_agent(llm=llm, tools=tools, prompt=prompt)
# verbose=True 打印具体的agent的执行明细
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)
response = agent_executor.invoke({"input": "在114.114.114.114 dns服务器上进行使用dig www.sina.com域名,并获取对应的IPV4记录 "})
print(response)