19.langchain 入门到放弃(八)tools-CustomTools

72 阅读2分钟

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)

  ‍

  ‍

  ‍