MadcowD/ell项目中的工具使用机制详解
概述
MadcowD/ell项目中的工具使用功能是一个强大的特性,它允许语言模型与外部函数和服务进行交互。这个功能使得开发者能够创建更加动态和交互式的语言模型程序(LMPs),这些程序可以执行操作、检索信息并根据实时数据做出决策。
当前状态说明
需要注意的是,当前工具使用功能仍处于beta测试阶段,API可能会在未来版本中发生重大变化。在生产环境中使用时应格外谨慎。
工具定义基础
在ell中,工具是通过@ell.tool()
装饰器定义的Python函数。这个装饰器会将普通函数转换为语言模型可使用的工具。
基本示例
@ell.tool()
def create_claim_draft(claim_details: str,
claim_type: str,
claim_amount: float,
claim_date: str = Field(description="The date of the claim in the format YYYY-MM-DD.")):
"""Create a claim draft. Returns the claim id created."""
print("Create claim draft", claim_details, claim_type, claim_amount, claim_date)
return "claim_id-123234"
模式生成机制
ell使用函数检查和Pydantic模型的组合来生成工具模式:
- 从函数签名中提取参数信息
- 使用类型注解确定参数类型
- 利用Pydantic的
Field
添加参数元数据 - 创建Pydantic模型来表示工具参数
生成的模式会被转换为与OpenAI API兼容的格式。
在LMP中使用工具
要在语言模型程序中使用工具,需要在@ell.complex
装饰器中指定它们:
@ell.complex(model="gpt-4o", tools=[create_claim_draft], temperature=0.1)
def insurance_claim_chatbot(message_history: List[Message]) -> List[Message]:
return [
ell.system("""You are an insurance adjuster AI..."""),
] + message_history
单步工具使用
单步工具使用是指语言模型在执行过程中决定使用一次工具。典型流程包括:
- LMP接收输入
- 生成带有工具调用的响应
- 执行工具调用
- 返回结果
示例:获取网站内容
@ell.tool()
def get_html_content(url: str = Field(description="The URL to get the HTML content of...")):
"""Get the HTML content of a URL."""
response = requests.get("https://" + url)
soup = BeautifulSoup(response.text, 'html.parser')
return soup.get_text()[:100]
@ell.complex(model="gpt-4o", tools=[get_html_content])
def get_website_content(website: str) -> str:
"""You are an agent that can summarize the contents of a website."""
return f"Tell me what's on {website}"
多步工具使用
多步工具使用涉及更复杂的交互,语言模型可能会在对话或处理流程中多次使用工具。ell提供了call_tools_and_collect_as_message()
辅助函数来简化这个过程。
并行工具执行
ell支持多个工具调用的并行执行:
if response.tool_calls:
tool_results = response.call_tools_and_collect_as_message(parallel=True, max_workers=3)
未来特性展望
急切模式(Eager Mode)
未来可能引入的"急切模式"将自动执行语言模型生成的工具调用,在后台创建多步交互,从而简化开发过程。
工具规范自动生成
理想情况下,工具规范应该能够直接从工具源代码推断出来。ell可以提取任何Python函数的词法闭包源,实现由另一个语言模型自动生成规范的功能。
自动生成示例
@ell.tool(autogenerate=True)
def search_twitter(query, n=7):
...
这将生成相应的工具规范,无需用户手动指定每个参数和工具描述。
挑战与解决方案
- 意见性问题:可以通过要求用户实现自己的工具规范生成器来解决
- 可重复性问题:可以通过序列化生成的工具规范及其版本来解决
通过要求规范生成器使用temperature=0.0并保持接近确定性的输出,可以确保生成的工具规范在不同运行中保持一致。
总结
MadcowD/ell项目中的工具使用功能为语言模型程序提供了强大的扩展能力,使它们能够与现实世界进行交互。虽然当前功能仍在开发中,但其设计理念和未来发展方向展示了巨大的潜力。开发者可以利用这些功能创建更加智能和交互式的应用,同时需要注意当前版本的实验性质。