DSPy: 在40行代码中使用自定义工具构建AI智能体 | 从零到英雄
停止编写复杂的提示,让我们来编写可用于生产的代码。
延续我们之前介绍DSPy框架作为管理Prompt Engineering工具的文章(DSPY: 停止提示,开始编程),今天我们将探讨如何应用DSPy来创建一个能够使用自定义工具的AI代理。
什么是DSPy?
DSPy是由斯坦福大学开发的框架,它改变了我们与大型语言模型(LLMs)合作的方式。它不需要编写复杂的提示,而是通过声明性编程来指定程序应该做什么,而不是如何做。
代码是如何工作的
1. LLM 设置:我们使用 Gemini 作为我们的主要语言模型 2. 自定义工具:创建一个模拟函数来获取天气数据 3. 签名:定义 Agent 将接收和发送的数据结构 4. Agent 类: - 使用 ReAct 管理工具的使用 - 维护对话历史 - 处理用户交互
用 DSPy 构建 AI 代理
1. 设置LLM引擎
在这一部分中,我们使用谷歌的新LLM Gemini,但您也可以切换到其他模型,比如OpenAI GPT-4,甚至是在先前文章中提到的OpenThaiGPT本地模型。
import dspy
import os
llm = dspy.LM(
model="gemini/gemini-1.5-flash-latest",
api_key=os.getenv("GEMINI_API_KEY")
)
dspy.configure(lm=llm)
2. 创建自定义工具
这个函数只是使用模拟数据的一个示例,但在实际应用中,您可以用API调用替换它,比如:- 天气API- 数据库查询- 外部服务
def get_weather(city: str) -> str:
"""Get weather data for a city"""
mock_data = {
"New York": "Sunny, 25°C",
"Los Angeles": "Cloudy, 20°C",
"Chicago": "Rainy, 15°C",
"Houston": "Thunderstorms, 30°C",
"Phoenix": "Sunny, 35°C"
}
return mock_data.get(city, "Weather data not available")
3. 定义代理签名
创建一个签名,定义代理程序的输入和输出格式:
class Agent_tools(dspy.Signature):
"""AI assistant Able to use tools"""
input_query = dspy.InputField()
history = dspy.InputField(desc="Chat History")
output = dspy.OutputField(desc="Response to User")
签名是告诉DSPy的一个关键组件:- input_query:用户的问题或指令- history:以前的对话历史- output:代理的回应
4. 创建代理类
创建主Agent类,处理会话和工具使用:
class Agent(dspy.Module):
def __init__(self):
super().__init__()
self.history = []
self.tools_utils = dspy.ReAct(Agent_tools, tools=[get_weather])
def __call__(self, input: str):
self.add_memory(input)
str_history = "\n".join(self.history.copy())
result = self.tools_utils(input_query=input, history=str_history).output
self.add_memory(result)
return result
def add_memory(self, memory: str):
self.history.append(("USER: "if len(self.history) % 2 == 0 else "AI: ") + memory)
使用`dspy.ReAct`的关键特点: - 支持多个工具 - 同时处理多个输入 - 方便添加新的工具
5. 使用代理
最后,我们可以创建一个聊天循环来测试代理。
chat_module = Agent()
while True:
human_input = input("You: ")
print("AI: ", chat_module(human_input))
正如您所见,我们的代理可以同时使用多种工具处理查询。
使用DSPy的好处
1. 简洁的代码:仅需40行即可创建出色的AI代理 2. 灵活性:轻松添加管道和定制工具 3. 效率:DSPy 自动处理提示工程 4. 可读性:代码结构清晰,易于阅读
结论
DSPy使构建AI代理更加容易,特别是对于那些希望减少提示工程复杂性的开发人员而言。根据我在之前文章中提到的测试各种框架的经验,DSPy在当今发展AI代理方面是一个有趣的选择。