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("今天杭州天气怎么样"))