langchain-Tools

langchain-Tools

起男 27 2025-05-15

langchain-Tools

@tool方式

import datetime
from langchain_openai import ChatOpenAI
from langchain.tools import tool
import os

# 大模型
llm = ChatOpenAI(
    api_key=os.environ.get("ALI_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model="qwen-max"
)
#声明工具 名称不提供默认用方法名
# 默认使用注解告知模型工具作用也可用使用description
@tool
def get_current_date():
    """获取今天日期"""
    return datetime.datetime.today().strftime("%Y-%m-%d")
# 工具容器
all_tools = {"get_current_date": get_current_date}
# 把消息存储在一起
query = "今天是几月几号"
messages = [query]
#绑定工具
llm_with_tools = llm.bind_tools([get_current_date])
#此时返回的是一个tool_calls,content是空的
ai_msg = llm_with_tools.invoke(messages)
print(ai_msg)
#需要把此次相应也保存并一并回传,并且tool的结果需要在后面
messages.append(ai_msg)
#本地找到并调用函数,将结果返回给大模型
if ai_msg.tool_calls:
    for tool_call in ai_msg.tool_calls:
        selected_tool = all_tools[tool_call["name"].lower()]
        tool_msg = selected_tool.invoke(tool_call)
        messages.append(tool_msg)
#再次调用
print(llm_with_tools.invoke(messages).content)

StructuredTool方式

import datetime
from langchain_openai import ChatOpenAI
from langchain_core.tools import StructuredTool
import os

# 大模型
llm = ChatOpenAI(
    api_key=os.environ.get("ALI_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model="qwen-max"
)
#声明工具
def get_current_date():
    """获取今天日期"""
    return datetime.datetime.today().strftime("%Y-%m-%d")
#定义工具
dateTool = StructuredTool.from_function(func=get_current_date,description="获取今天日期",name="get_current_date")
# 工具容器
all_tools = {"get_current_date": dateTool}
# 把消息存储在一起
query = "今天是几月几号"
messages = [query]
#绑定工具
llm_with_tools = llm.bind_tools([dateTool])
#此时返回的是一个tool_calls,content是空的
ai_msg = llm_with_tools.invoke(messages)
print(ai_msg)
#需要把此次相应也保存并一并回传,并且tool的结果需要在后面
messages.append(ai_msg)
#本地找到并调用函数,将结果返回给大模型
if ai_msg.tool_calls:
    for tool_call in ai_msg.tool_calls:
        selected_tool = all_tools[tool_call["name"].lower()]
        tool_msg = selected_tool.invoke(tool_call)
        messages.append(tool_msg)
#再次调用
print(llm_with_tools.invoke(messages).content)

将大模型封装为tool

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
import os

# 大模型
llm = ChatOpenAI(
    api_key=os.environ.get("ALI_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model="qwen-max"
)
#定制一个chain
prompt = ChatPromptTemplate.from_messages([
    ("human","请将我的话语转为英语 {text}")
])
#格式化输出
parser = StrOutputParser()
#lcel
chain = prompt | llm | parser
#将chain转为工具
as_tool = chain.as_tool(name="my_tool",description="翻译任务")
# 工具容器
all_tools = {"my_tool": as_tool}
# 把消息存储在一起
query = "今天天气真冷用英语怎么说"
messages = [query]
#绑定工具
llm_with_tools = llm.bind_tools([as_tool])
#此时返回的是一个tool_calls,content是空的
ai_msg = llm_with_tools.invoke(messages)
print(ai_msg)
#需要把此次相应也保存并一并回传,并且tool的结果需要在后面
messages.append(ai_msg)
#本地找到并调用函数,将结果返回给大模型
if ai_msg.tool_calls:
    for tool_call in ai_msg.tool_calls:
        selected_tool = all_tools[tool_call["name"].lower()]
        tool_msg = selected_tool.invoke(tool_call)
        messages.append(tool_msg)
#再次调用
print(llm_with_tools.invoke(messages).content)

注意: 0.3版本暂时处于实验阶段

agent方式

上面的几种方式需要手动的二次调用非常麻烦,langchain提供了agent方式封装了负责的操作

from langchain.agents import initialize_agent, AgentType
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
import os

# 大模型
llm = ChatOpenAI(
    api_key=os.environ.get("ALI_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model="qwen-max"
)
#定义工具
@tool
def get_city_weather(city:str):
    """获取某个城市的天气
    Args:
        city:具体城市
    """
    return f"城市:{city},今天暴雨"
#初始化代理
agent = initialize_agent(
    tools=[get_city_weather], #工具列表
    llm=llm,
    agent=AgentType.OPENAI_FUNCTIONS,
    verbose=True
)
print(agent.invoke("今天杭州天气怎么样"))