1 OpenAI函数智能体概述
OpenAI 函数智能体是一种结合了OpenAI函数调用能力的智能体类型,它允许语言模型(如GPT-3.5和GPT-4)以结构化的方式使用工具。与ReAct智能体通过自由文本格式来推理和使用工具不同,OpenAI函数智能体利用模型内置的函数调用能力,能够生成结构良好的函数调用参数,大大提高了工具使用的准确性和可靠性。
这种智能体特别适合需要结构化输出和工具调用的应用场景,例如API调用、数据查询和结构化任务执行。

2 OpenAI工作原理
OpenAI函数智能体的工作原理如下:
工具声明:将工具定义为函数(包含名称、描述和参数模式)
模型调用:向OpenAI模型发送用户查询和可用工具信息
函数选择:模型决定是直接回答还是调用特定函数
参数生成:如果选择调用函数,模型生成符合函数参数模式的JSON参数
参数生成:如果选择调用函数,模型生成符合函数参数模式的JSON参数
结果处理:将函数执行结果返回给模型进行下一步决策或最终回答生成

3 计划执行智能体优势
结构化输出:确保参数格式正确,减少解析错误
更高的准确性:模型被优化为正确调用函数,减少格式错误
简化提示工程:无需在提示中详细说明工具使用格式
高效工具选择:能够智能选择最适合当前任务的工具
更强的类型安全:函数参数具有严格的类型检查
4 个人助理应用
4.1 导入LangChain模块,调用阿里云百炼大模型
备注:代码中阿里百炼的API Key是个人的,文章24小时后会删除,请更换自己的API Key。
from langchain.tools import toolfrom langchain_openai import ChatOpenAIfrom langchain.agents import AgentExecutor, create_openai_functions_agentfrom langchain.tools import DuckDuckGoSearchRun, WikipediaQueryRun, toolfrom langchain_community.utilities import WikipediaAPIWrapperfrom langchain.prompts import ChatPromptTemplate, MessagesPlaceholderfrom langchain.memory import ConversationBufferMemoryimport osos.environ["DASHSCOPE_API_KEY"] = "sk-212cd36c049d416d9479714327f41e51"llm = ChatOpenAI( api_key=os.getenv("DASHSCOPE_API_KEY"), base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", model="qwen-plus")
4.2 创建旅行工具
search_tool = DuckDuckGoSearchRun(name="搜索")@tooldef get_weather(location: str, unit: str = "celsius"): """获取指定位置的天气信息""" return f"{location}天气晴朗,温度25{unit[0]}"@tooldef check_calendar(date: str): """查看指定日期的日程安排""" return f"{date}的日程:9:00 团队会议,12:00 午餐,14:00 客户拜访"@tooldef add_event(date: str, time: str, description: str): """向日历添加新事件""" return f"已添加:{date} {time} - {description}"@tooldef send_email(to: str, subject: str, body: str): """发送电子邮件""" return f"已向{to}发送主题为'{subject}'的电子邮件"
4.3 创建旅行规划智能体
assistant_tools = [check_calendar, add_event, send_email, get_weather, search_tool]personal_assistant = create_openai_functions_agent( llm=llm, tools=assistant_tools, prompt=ChatPromptTemplate.from_messages([ ("system", "你是一个高效的个人助理。使用提供的工具来帮助用户管理日程和处理任务。"), MessagesPlaceholder(variable_name="chat_history"), ("human", "{input}"), MessagesPlaceholder(variable_name="agent_scratchpad"), ]))personal_assistant_executor = AgentExecutor( agent=personal_assistant, tools=assistant_tools, memory=ConversationBufferMemory(memory_key="chat_history", return_messages=True), verbose=True)meeting_request = "帮我制定一个明天工作的行程计划。上午9点到10点,通知大家提前4会集合,讨论课程研发的事情!"meeting_plan = personal_assistant_executor.invoke({"input": meeting_request})print("会议日程:\n", meeting_plan["output"])