利用代理许可我们给LLMs供应访问工具(Tools)的权限。这些工具供应了无限的可能性。有了工具,LLMs可以搜索网页、做数学打算、运行代码等等。
LangChain库供应了一系列预建的工具。然而,在许多实际项目中,我们常常会创造现有工具只能知足一定的需求。这意味着我们必须修正现有工具或构建全新的工具。
本文将磋商如何为LangChain中的代理(Agents)构建自定义工具。

一、定义函数
在LangChain中,自定义工具是由用户定义的,用以实行LangChain工具包中原生工具不供应的特界说务或操作。
它们许可用户扩展LangChain的功能,并根据自己的特定需求进行定制。
本文自定义工具的开拓,我们将利用 TheMealDB,这是一个来自天下各地的食谱的开源、众包数据库。它不须要 API 密钥,虽然有点慢,但免费,不须要注册。
网址:https://www.themealdb.com/
由于须要调用外部 API,因此须要 Python requests 库,还须要 Tool 库:
import osimport streamlit as stfrom langchain_openai import ChatOpenAIfrom langchain.agents import AgentExecutorfrom langchain.prompts import ChatPromptTemplate, MessagesPlaceholderfrom langchain_core.utils.function_calling import convert_to_openai_functionfrom langchain.agents.format_scratchpad import format_to_openai_functionsfrom langchain.agents.output_parsers import OpenAIFunctionsAgentOutputParserfrom langchain.memory import ConversationBufferMemoryimport requestsfrom langchain.agents import Tool
导入必要的库和模块:
os 用于设置环境变量。streamlit 用于构建和运行Web运用界面。langchain_openai 和 langchain 干系模块用于构建和实行与OpenAI模型的交互。requests 用于向TheMealDB API发起HTTP要求。# 定义向TheMealDB API发起调用的函数def make_api_call(base_url, params): """ 向TheMealDB发起API要求,并返回JSON相应。 参数: base_url (str): API端点的根本URL。 params (dict): API要求的参数。 返回值: dict: API调用返回的JSON相应。 """ # 发起API要求 response = requests.get(base_url, params=params) # 检讨要求是否成功 if response.status_code == 200: # 成功则返回JSON相应 return response.json() else: # 要求失落败,记录缺点信息 st.error(f"API Request failed with status code: {response.status_code}") # 要求失落败时返回None return None# 根据category, ingredient, and ID获取食谱列表def get_recipes_by_category(category): """ 根据种别获取食谱列表 参数: category - 字符串类型,指定要查询的食谱种别 返回值: 返回调用API后得到的食谱数据,数据格式为JSON """ return make_api_call( "https://www.themealdb.com/api/json/v1/1/filter.php", {"c": category})def get_recipes_by_ingredient(ingredient): """ 根据指定的食材获取食谱列表。 参数: - ingredient: 食材的名称,用于搜索食谱。 返回值: - 返回调用API后得到的JSON相应数据,包含匹配的食谱信息。 """ return make_api_call( "https://www.themealdb.com/api/json/v1/1/filter.php", {"i": ingredient})def get_recipe_by_id(id): """ 根据食谱ID从网络获取食谱详情。 参数: id (str): 食谱的唯一标识符。 返回: dict: 从API调用返回的食谱详情,格式为JSON字典。 """ return make_api_call( "https://www.themealdb.com/api/json/v1/1/lookup.php", {"i": id})
这段代码定义了一系列的函数,用于与TheMealDB API进行交互。TheMealDB是一个供应食谱信息的在线做事,通过API可以查询不同类别的食谱、食材和食谱ID。下面是每个函数的详细阐明:
1. make_api_call(base_url, params) 函数是用来发起对TheMealDB API的HTTP GET要求的通用函数。
base_url 参数是API端点的根本URL。
params 是一个字典,包含了API要求须要的查询参数。
函数会发送要求并检讨相应状态码。如果状态码为200,表示要求成功,它会返回API的JSON相应。如果要求失落败,它会利用st.error来记录缺点信息,并返回None。
2. get_recipes_by_category(category) 函数根据供应的种别category来获取食谱列表。
它调用make_api_call函数,传入TheMealDB的特定端点和一个包含种别信息的参数字典。
返回的是一个JSON格式的食谱数据。
3. get_recipes_by_ingredient(ingredient) 函数根据指定的食材ingredient来获取食谱列表。
它同样调用make_api_call函数,并传入相应的API端点和食材参数。
返回的是一个包含匹配食材食谱信息的JSON相应数据。
4. get_recipe_by_id(id) 函数根据食谱的唯一标识符id来获取食谱的详细信息。
它调用make_api_call函数,传入另一个API端点和食谱ID参数。
返回的是一个包含食谱详情的JSON格式字典。
这些函数都是API的包装器(wrappers),它们将API调用抽象化,使得在代码中更随意马虎重用和调用API。把稳代码中利用了requests.get来发起网络要求,这意味着须要在环境中安装requests库,并且st.error表明这段代码是在Streamlit运用程序中利用,用于在用户界面上显示缺点信息。
二、自定义工具列表
定义了一个名为 tools 的列表,它包含了三个 Tool 工具。每个 Tool 工具都是一个自定义工具,用于与 TheMealDB API 进行交互。每个工具都有一个名称、一个与之关联的函数,以及一个描述其用场的描述字符串。这些工具是为了在 LangChain 框架中利用而定义的,以便能够通过框架的机制来调用这些函数。
# 定义与TheMealDB API协作的工具tools = [ # 根据食材查询食谱的工具 Tool(name="RecipesByIngredient", func=get_recipes_by_ingredient, description="Useful for getting recipes based on an ingredient"), # 根据种别查询食谱的工具 Tool(name="RecipesByCategory", func=get_recipes_by_category, description="Useful for getting recipes based on a category"), # 根据食谱ID查询特定食谱的工具 Tool(name="RecipeById", func=get_recipe_by_id, description="Useful for getting a specific recipe based on a recipe ID")]
RecipesByIngredient:这个工具利用 get_recipes_by_ingredient 函数。它的目的是根据用户供应的食材来获取食谱列表。描述解释了这个工具可以用来基于一个食材获取食谱。
RecipesByCategory:这个工具利用 get_recipes_by_category 函数。它的目的是根据用户指定的种别来获取食谱列表。描述解释了这个工具可以用来基于一个种别获取食谱。
RecipeById:这个工具利用 get_recipe_by_id 函数。它的目的是根据食谱的唯一标识符(ID)来获取特定的食谱详细信息。描述解释了这个工具可以用来基于食谱ID获取特定的食谱。
通过将这些函数封装成工具,然后将工具与模型绑定,模型就可以访问工具了。下一章将连续先容这部分的内容。
#头条创作寻衅赛#