当前位置: 首页 > ai >正文

LangChain实战(十九):集成OpenAI Functions打造强大Agent

本文是《LangChain实战课》系列的第十九篇,将深入探讨如何利用OpenAI的Function Calling特性来构建更可靠、更高效的智能代理应用。通过学习本文,您将掌握如何利用结构化输出和函数调用能力来大幅提升Agent的性能和可靠性。

前言

在传统的ReAct模式中,LLM需要输出文本形式的思考过程和行动决策,这常常导致格式不稳定、解析困难等问题。OpenAI的Function Calling特性彻底改变了这一局面,它允许LLM输出结构化的函数调用请求,而不是自由格式的文本。这种范式转变让Agent开发变得更加可靠、高效和易于维护。

OpenAI Function Calling的核心优势

与传统ReAct模式的对比

传统ReAct模式的挑战:

  1. 输出格式不稳定:LLM可能以不同格式输出行动决策

  2. 解析复杂度高:需要复杂的正则表达式或解析逻辑

  3. 错误处理困难:不规范的输出导致难以捕获和处理错误

  4. 开发效率低:大量的代码用于解析和验证LLM输出

OpenAI Function Calling的优势:

  1. 结构化输出:LLM始终返回规范的JSON格式函数调用

  2. 自动验证:OpenAI平台会验证函数调用的格式和参数

  3. 开发简化:大幅减少解析和错误处理代码

  4. 可靠性提升:函数调用的成功率和准确性显著提高

  5. 类型安全:支持参数类型定义和验证

环境准备与安装

首先安装必要的依赖包:

# 安装核心库
pip install langchain openai python-dotenv# 安装其他工具库
pip install requests beautifulsoup4# 安装可选的数据处理库
pip install pandas numpy# 安装用于演示的工具库
pip install python-dateutil

设置必要的环境变量:

export OPENAI_API_KEY="your-openai-api-key"

基础概念:OpenAI Functions的工作原理

1. 函数定义(Function Definition)

首先需要定义函数的结构,包括名称、描述和参数schema:

from pydantic import BaseModel, Field
from typing import List, Optional, Type
import json# 定义天气查询函数的参数模型
class WeatherQuery(BaseModel):location: str = Field(description="需要查询天气的城市名称")unit: Optional[str] = Field("celsius", description="温度单位:celsius或fahrenheit")# 定义股票查询函数的参数模型
class StockQuery(BaseModel):symbol: str = Field(description="股票代码,如AAPL、GOOGL")timeframe: Optional[str] = Field("1d", description="时间范围:1d、1w、1m、1y")# 定义计算器函数的参数模型
class CalculationInput(BaseModel):expression: str = Field(description="数学表达式,如2+3*4")# 定义搜索函数的参数模型
class SearchQuery(BaseModel):query: str = Field(description="搜索查询关键词")max_results: Optional[int] = Field(5, description="最大返回结果数量")

2. 函数实现(Function Implementation)

实现具体的函数逻辑:

import requests
from datetime import datetime
import math
import reclass FunctionImplementations:def __init__(self):# 模拟天气数据self.weather_data = {"beijing": {"temperature": 22, "condition": "晴天", "humidity": 45},"shanghai": {"temperature": 25, "condition": "多云", "humidity": 60},"new york": {"temperature": 18, "condition": "小雨", "humidity": 75}}# 模拟股票数据self.stock_data = {"AAPL": {"price": 175.5, "change": +2.3},"GOOGL": {"price": 135.2, "change": -0.8},"TSLA": {"price": 245.7, "change": +5.1}}def get_weather(self, location: str, unit: str = "celsius") -> str:"""获取天气信息"""location_lower = location.lower()if location_lower in self.weather_data:data = self.weather_data[location_lower]temp = data["temperature"]if unit == "fahrenheit":temp = temp * 9/5 + 32return f"{location}的天气: {data['condition']}, 温度: {temp}°{unit[0].upper()}, 湿度: {data['humidity']}%"else:return f"找不到{city}的天气信息"def get_stock_info(self, symbol: str, timeframe: str = "1d") -> str:"""获取股票信息"""symbol_upper = symbol.upper()if symbol_upper in self.stock_data:data = self.stock_data[symbol_upper]change_type = "上涨" if data["change"] >= 0 else "下跌"return f"{symbol_upper}股票信息: 价格${data['price']}, {timeframe}{change_type}{abs(data['change'])}%"else:return f"找不到{symbol}的股票信息"def calculate_expression(self, expression: str) -> str:"""计算数学表达式"""try:# 简单的安全计算if not re.match(r'^[\d+\-*/().\s]+$', expression):return "错误: 表达式包含不安全的字符"result = eval(expression)return f"{expression} = {result}"except Exception as e:return f"计算错误: {str(e)}"def web_search(self, query: str, max_results: int = 5) -> str:"""模拟网络搜索"""# 在实际应用中,这里会调用真实的搜索APIreturn f"搜索 '{query}' 返回了 {max_results} 个结果:\n1. {query}的相关信息1\n2. {query}的相关信息2\n...(模拟数据)"# 创建函数实现实例
function_impl = FunctionImplementations()

构建基于OpenAI Functions的Agent

1. 定义函数工具集

from langchain.tools import StructuredTool
from langchain.agents import AgentType, initialize_agent
from langchain.chat_models import ChatOpenAIclass OpenAIFunctionsAgent:def __init__(self):self.llm = ChatOpenAI(model_name="gpt-3.5-turbo",temperature=0,model_kwargs={"functions": self._get_function_schemas()})self.tools = self._create_tools()self.agent = self._initialize_agent()def _get_function_schemas(self) -> List[dict]:"""定义函数schema"""return [{"name": "get_weather","description": "获取指定城市的天气信息","parameters": WeatherQuery.schema(),},{"name": "get_stock_info","description": "获取股票信息","parameters": StockQuery.schema(),},{"name": "calculate_expression","description": "计算数学表达式","parameters": CalculationInput.schema(),},{"name": "web_search","description"
http://www.xdnf.cn/news/20202.html

相关文章:

  • Day37 MQTT协议 多客户端服务器模型
  • 手写MyBatis第53弹: @Intercepts与@Signature注解的工作原理
  • 工业洗地机和商用洗地机的区别是什么?
  • 【基础-单选】关于bundleName,下列说法正确的是?
  • 波特率vs比特率
  • rh134第三章复习总结
  • 贪心算法应用:保险理赔调度问题详解
  • Java中的死锁
  • 使用 MongoDB.Driver 在 C# .NETCore 中实现 Mongo DB 过滤器
  • [数据结构] ArrayList(顺序表)与LinkedList(链表)
  • 万代《宝可梦》主题新品扭蛋公开!史上最大尺寸
  • 机器人控制器开发(传感器层——奥比大白相机适配)
  • 【FastDDS】Layer Transport ( 05-Shared Memory Transport)
  • 天气预报云服务器部署实战
  • 在Java AI项目中实现Function Call功能
  • 计算机毕设大数据方向:基于Spark+Hadoop的餐饮外卖平台数据分析系统【源码+文档+调试】
  • 通过Idea 阿里插件快速部署java jar包
  • 实用向:Linux Shell 脚本实现 CPU / 内存 / 硬盘 + IO / 网络多指标告警(支持 163/QQ/139 邮箱)
  • python调用mysql
  • PDF文件基础-计算机字体
  • 【Luogu_P8118】 「RdOI R3.5」Mystery【Slope Trick】【DP】
  • 深度学习基础概念回顾(Pytorch架构)
  • 【Java实战㉗】Java日志框架实战:Logback与Log4j2的深度探索
  • 大型Go项目中搭建CI/CD流水线
  • 竞价代运营:百度竞价账户托管优化
  • VeeValidate v4 终极指南:精通 Vue 3 组合式 API 表单验证
  • Web Worker 从原理到实战 —— 把耗时工作搬到后台线程,避免页面卡顿
  • 计算机视觉(九):图像轮廓
  • 破局功能割裂、成本高昂、协同低效,遨游天通卫星电话实现一机多能
  • Adobe Illustrator(Ai) 2022矢量设计软件的安装教程与下载地址