[langchain]如何用langchain实现一个tool
本文介绍了如何使用LangChain实现自定义工具(tool),重点演示了文件读写功能的实现。首先回顾了之前关于LangChain调用大模型、文档处理等基础知识的相关文章。文章指出,工具(tool)可以看作是大模型的"手脚",其实现依赖于大模型的函数调用功能。虽然LangChain社区提供了FileManagementToolkit工具包,但作者建议自行实现文件读写工具以理解其
在前面的学习中,我们使用langchain调用大模型,我们使用langchain的文档loader和text spliter甚至是embedding和vector store了解了,参见文章:
https://blog.csdn.net/lineuman/article/details/150466154
https://blog.csdn.net/lineuman/article/details/150204441?spm=1001.2014.3001.5501
在这篇文章中学习使用langchain实现一个tool
如果说大模型是大脑,那么tool可以理解为手和脚。
langchain中tool的实现还是依赖于大模型的,大模型有一个功能叫做函数调用,
langchain community中有一个FileManagementToolkit,顾名思义,就是文件操作相关的。这里我们自己实现一个文件读写的工具,来交给大模型调用。自己实现是为了了解其原理,因为FileManagementToolkit是本地的,总有一天你需要操作沙盒或者网络文件,这个时候就要你自己实现了。
先看一下FileManagementToolkit怎么用
from langchain_community.agent_toolkits import FileManagementToolkit
toolkit = FileManagementToolkit(root_dir=".")
tools = toolkit.get_tools()
for tool in tools:
print(tool.name, tool.description)
if tool.name == 'read_file':
read_file_tool = tool
print(read_file_tool.invoke({"file_path": "app.py"}))
自己实现一个read_file tool
并且调用,不过要注意的是,这里用了太多的手动调用,实际不实用,下面我们逐步深入,如何能够自动调用
from langchain_community.agent_toolkits import FileManagementToolkit
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage,AIMessage
from langchain_core.tools import BaseTool, tool
from dotenv import load_dotenv
load_dotenv()
@tool
def read_file(file_path: str) -> str:
"""Read a file and return its contents."""
with open(file_path, "r", encoding="utf-8") as f:
return f.read()
model = init_chat_model("deepseek-chat")
model_with_tool = model.bind_tools([read_file])
msg = model_with_tool.invoke([HumanMessage(content="What is the content of app.py?")])
print(msg.tool_calls)
result = read_file.invoke(msg.tool_calls[0]["args"])
print(result)
方法一可以写个循环,判断如果是tool_calls那么就进行调用
方法二使用langchain提供的agent
在工具调用之前,也可以增加一个人工的approve
总结一下之前的概念
documents
document loader
embedding
vector store
message: system human ai
tool_call 还是call_tool?
How to cache chat model responses
通俗来说,langchain里面介绍了很多调用llm的概念。如果不用langchain用其他框架可能也会用到。
当然了,有时候同一个问题,我们还是希望不同的答案,那这种情况就不要开启缓存了。
可以使用内存缓存,也可以使用SQLiteCache缓存
from langchain_core.caches import InMemoryCache
from langchain_community.cache import SQLiteCache
How to handle rate limits
from langchain_core.rate_limiters import InMemoryRateLimiter
rate_limiter = InMemoryRateLimiter(
requests_per_second=0.1, # <-- Super slow! We can only make a request once every 10 seconds!!
check_every_n_seconds=0.1, # Wake up every 100 ms to check whether allowed to make a request,
max_bucket_size=10, # Controls the maximum burst size.
)
明天学习How to pass multimodal data to models
还有就是retriever还要看看
更多推荐
所有评论(0)