AI系列:大语言模型的function calling(下)- 使用LangChain

2024-04-18 06:04

本文主要是介绍AI系列:大语言模型的function calling(下)- 使用LangChain,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 前言
  • LangChain Tool/Function calling
    • 1. Tool/function加强功能
      • LangChain的tool装饰器
      • 其他方式: Pydantic
    • 2. 绑定tools/functions
    • 3. 调用大模型(LLM)
    • 4. function calling处理流程
  • LangChain版代码
  • 与原生LLM调用的比较
  • 参考

前言

在AI系列:大语言模型的function calling(上) 中我们实现了OpenAI原生的function calling。这篇文章将继续探讨如何使用LangChain实现大语言模型(LLM)的function calling。

LangChain Tool/Function calling

LangChain提供了对LLM function calling的支持。前提是底层大模型必须支持function calling。

1. Tool/function加强功能

LangChain的tool装饰器

LangChain在langchain_core模块中的tools子模块中提供了名为tool的装饰器,将根据函数定义和注释自动生成不同LLM function calling功能需要的schema,然后传递给LLM。后续对于LLM的调用将包括这些function/tool schema。

在Python中可以通过下面这种方式为自己定义的函数导入tool装饰器:

from langchain_core.tools import tool
@tool
def multiply(first_int: int, second_int: int) -> int:"""两个整数相乘"""return first_int * second_int@tool
def add(first_add: int, second_add: int) -> int:"""两个整数相加"""return first_add + second_addtools=[multiply, add]

其他方式: Pydantic

除了tool解释器,LangChain还支持用Pydantic来定义schema的方式。比如:

from langchain_core.pydantic_v1 import BaseModel, Field# 注释很重要,会被用来生成schema。
class Add(BaseModel):"""Add two integers together."""a: int = Field(..., description="First integer")b: int = Field(..., description="Second integer")tools=[Add]

2. 绑定tools/functions

绑定tool组成的列表后,LangChain将根据函数定义和注释自动生成底层LLM的function calling功能需要的schema,并传递给LLM。以OpenAI为例,

from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo")
llm_with_tools = llm.bind_tools(tools)

3. 调用大模型(LLM)

LangChain调用LLM的接口输入参数为Message的列表。它抽象了几个不同的Message类型。以OpenAI为例,它们分别对应OpenAI的不同role属性的对话项。比如HumanMessage, AIMessage, ToolMessage分别对应OpenAI的user, assistant和tool的角色。

from langchain_core.messages import HumanMessage, ToolMessage
prompt = "一共有3个人,每个人有15个苹果,10个鸭梨,一共有多少苹果?"messagesLC = [HumanMessage(prompt)
]

调用的方法也比较直接,直接调用invoke方法即可。注意我们已经将tools绑定在LLM中,调用时,LangChain将自动将tools的schema传递给LLM。

#通过LangChain调用LLM接口,将LLM回复加入对话上下文
response = llm_with_tools.invoke(messagesLC) 
messagesLC.append(response)

返回类型为AIMessage。

4. function calling处理流程

function calling整个处理的逻辑与上篇中的介绍完全一致,这里就不累述了。具体可以参考AI系列:大语言模型的function calling(上)

整个对话上下文如下,抽象成这样,是不是感觉比OpenAI原生的更清楚一点:

[
HumanMessage(content='一共有3个人,每个人有15个苹果,10个鸭梨,一共有多少苹果?'), 
AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_LsvajoCqf1G6ZNNS8M1gildQ', 'function': {'arguments': '{"first_int":3,"second_int":15}', 'name': 'multiply'}, 'type': 'function'}]}, response_metadata={'finish_reason': 'tool_calls', 'logprobs': None}), 
ToolMessage(content='45', tool_call_id='call_LsvajoCqf1G6ZNNS8M1gildQ'), 
AIMessage(content='一共有45个苹果。', response_metadata={'finish_reason': 'stop', 'logprobs': None})
]

LangChain版代码

以下是LangChain版function calling的实现代码,可以对比大语言模型的function calling(上) OpenAI原生版的实现代码。

__author__ = 'liyane'import json# 初始化环境
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())#定义function/tool 1: multiply,应用tool装饰器
from langchain_core.tools import tool
@tool
def multiply(first_int: int, second_int: int) -> int:"""两个整数相乘"""return first_int * second_int#定义function/tool 2: add,应用tool装饰器
@tool
def add(first_add: int, second_add: int) -> int:"""两个整数相加"""return first_add + second_add
tools=[multiply, add]#定义大模型并绑定tools
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo")
llm_with_tools = llm.bind_tools(tools)#构建对话
from langchain_core.messages import HumanMessage, ToolMessage
prompt = "一共有3个人,每个人有15个苹果,10个鸭梨,一共有多少苹果?"messagesLC = [HumanMessage(prompt)
]#通过LangChain调用LLM接口,将LLM回复加入对话上下文
response = llm_with_tools.invoke(messagesLC) 
messagesLC.append(response)#如果LLM需要function calling,调用相应的函数,并将函数结果数据加入对话上下文,继续调用LLM。
while (response.additional_kwargs.get("tool_calls") is not None):for tool_call in response.additional_kwargs["tool_calls"]:selected_tool = {"add": add, "multiply": multiply}[tool_call["function"]["name"]]args = json.loads(tool_call["function"]["arguments"])tool_output = selected_tool(args)messagesLC.append(ToolMessage(tool_output, tool_call_id=tool_call["id"]))response = llm_with_tools.invoke(messagesLC) messagesLC.append(response)print("=====最终结果=====")
print(response.content)

与原生LLM调用的比较

对于Function calling这部分功能,使用LangChain可以节省大段的手工定义tool schema的代码,也避免了未来有变动时会产生的维护问题。

同时,LangChain屏蔽了底层LLM。当LLM改变时,无需重写代码,只需要替换LangChain对应LLM的库文件即可。

目前LangChain快速迭代过程中,代码大功能上可以用,在细节上可能存在问题,遇到具体问题时可能需要看它的代码。

参考

OpenAI / function calling
LangChain / Tool/function calling
LangChain Message Types

这篇关于AI系列:大语言模型的function calling(下)- 使用LangChain的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/913954

相关文章

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用