龙空技术网

【LangChain LCEL】7. 绑定运行时参数

草根之明 10

前言:

今天咱们对“编写程序输入华氏度输出摄氏度”大约比较重视,我们都需要知道一些“编写程序输入华氏度输出摄氏度”的相关内容。那么小编在网摘上网罗了一些有关“编写程序输入华氏度输出摄氏度””的相关文章,希望兄弟们能喜欢,各位老铁们一起来学习一下吧!

在编程的世界里,我们有时候像是在施展魔法,对着电脑念出咒语,期待屏幕上出现我们想要的结果。今天,我们要探讨的是一种特别的魔法——在Langchain中绑定运行时参数。这不仅仅是简单的咒语,而是一种能够让你的代码更加灵活和强大的高级技术。

为什么要绑定运行时参数?

想象一下,你正在编写一个程序,需要在不同的场景下重复使用同一段代码,但是每次都需要传递一些固定的参数。这就像是你每次施展同一个魔法,但是每次都需要说出不同的咒语。这不仅效率低下,而且容易出错。这时,Langchain的Runnable.bind()方法就像是一瓶魔法药水,让你的代码变得灵活多变,而且易于管理。

如何施展这个魔法?

让我们来看一个简单的例子。假设我们有一个简单的提示+模型序列:

# 首先,我们需要安装Langchain和相关的库!pip install --upgrade --quiet langchain langchain-openai# 导入必要的模块from langchain_core.output_parsers import StrOutputParserfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.runnables import RunnablePassthroughfrom langchain_openai import ChatOpenAI# 创建一个提示模板prompt = ChatPromptTemplate.from_messages([    ("system", "用代数符号写出下面的方程,然后解出它。使用以下格式:\n\n方程式:...\n解答:...\n\n"),    ("human", "{equation_statement}")])# 创建一个OpenAI聊天模型model = ChatOpenAI(temperature=0)# 创建一个Runnable对象runnable = (    {"equation_statement": RunnablePassthrough()}    | prompt    | model    | StrOutputParser())# 调用Runnable对象print(runnable.invoke("x的三次方加7等于12"))
方程式:x^3 + 7 = 12解答:首先将方程式改写为 x^3 = 12 - 7然后计算得到 x^3 = 5最后求解得到 x = ∛5所以方程的解为 x = ∛5

执行上述代码,你会得到一个方程式的解答。但是,如果我们想要在调用模型时加入特定的“停止”词汇,比如“解答”,我们可以这样做:

# 使用bind方法绑定参数runnable = (    {"equation_statement": RunnablePassthrough()}    | prompt    | model.bind(stop="解答")    | StrOutputParser())# 再次调用Runnable对象print(runnable.invoke("x的三次方加7等于12"))
方程式:x^3 + 7 = 12
附加OpenAI函数:魔法的扩展

Langchain的另一个强大功能是将OpenAI的函数附加到兼容的OpenAI模型上。这就像是给你的魔法书添加了新的咒语。例如,我们可以定义一个名为“solver”的函数:

# 定义一个函数function = {    "name": "solver",    "description": "构建并解决一个方程式",    "parameters": {        "type": "object",        "properties": {            "equation": {                "type": "string",                "description": "方程的代数表达式",            },            "solution": {                "type": "string",                "description": "方程的解",            },        },    },    "required": ["equation", "solution"],}# 创建一个使用gpt-4模型的Runnable对象,并附加函数prompt = ChatPromptTemplate.from_messages([    ("system", "用代数符号写出下面的方程,然后解出它。"),    ("human", "{equation_statement}"),])model = ChatOpenAI(model="gpt-4", temperature=0).bind(    function_call={"name": "solver"}, functions=[function])# 调用Runnable对象runnable = {"equation_statement": RunnablePassthrough()} | prompt | modelprint(runnable.invoke("x的三次方加7等于12"))

在Langchain框架中,定义函数的方式是通过创建一个字典(在Python中也称为映射或哈希表),这个字典遵循特定的结构来描述函数的元数据。这种结构不仅定义了函数的名称和描述,还包括了参数的详细信息和要求。下面,我们将详细探讨这个字典结构的每个部分,以及如何使用它来定义和绑定函数。

"name": 这是函数的名称,在这个例子中是"solver"。这是调用函数时用来识别它的标识符。"description": 提供了函数的简短描述,说明了函数的作用。在这个例子中,描述是"构建并解决一个方程式""parameters": 这个字段描述了函数接受的参数。它是一个嵌套的字典,包含两个子字段:"type": 指定了参数的整体类型。在这个例子中,参数类型被定义为"object",意味着参数是一个对象,或者说是一个字典。"properties": 描述了对象中的每个属性(即参数)。在这个例子中,有两个属性:"equation" 和"solution"。对于每个属性,我们指定了它的"type"(在这个例子中都是"string",表示字符串类型)和"description"(描述了参数的用途)。"required": 这是一个列表,包含了所有必需的参数。在这个例子中,"equation""solution"都是必需的,意味着在调用函数时,这两个参数必须被提供。

这个例子展示了如何将一个特定的函数附加到模型上,并在调用时传递参数。这样,我们的模型就能够执行更复杂的任务,而不仅仅是回答简单的问题。

附加 OpenAI 工具

是一个强大的特性,它允许开发者将特定的函数或工具绑定到OpenAI模型上,从而扩展模型的功能。这些工具可以是任何与OpenAI模型兼容的功能,比如获取当前天气、解决数学问题等。通过这种方式,开发者可以创建更加丰富和动态的交互体验。

定义工具

首先,我们需要定义一个工具,这通常是一个包含函数名称、描述和参数的字典。例如,我们可以定义一个获取当前天气的工具:

# 定义一个获取当前天气的工具tools = [    {        "type": "function",        "function": {            "name": "get_current_weather",            "description": "获取给定地点的当前天气",            "parameters": {                "type": "object",                "properties": {                    "location": {                        "type": "string",                        "description": "例如:旧金山,加利福尼亚州",                    },                    "unit": {                        "type": "string",                        "enum": ["celsius", "fahrenheit"],                        "description": "温度单位"                    },                },                "required": ["location"],            },        },    },]

在这个例子中,我们定义了一个名为get_current_weather的工具,它接受两个参数:locationunitlocation是必需的,而unit则有一个预定义的枚举类型,表示温度单位可以是摄氏度或华氏度。

绑定工具到模型

一旦我们定义了工具,我们就可以将其绑定到OpenAI模型上。这通常是通过调用模型的bind方法完成的,并将工具作为参数传递给这个方法。

复制# 创建一个OpenAI聊天模型并绑定工具model = ChatOpenAI(model="gpt-3.5-turbo-1106").bind(tools=tools)# 调用模型并获取天气信息result = model.invoke("What's the weather in SF, NYC and LA?")

在这个例子中,我们创建了一个使用gpt-3.5-turbo-1106模型的ChatOpenAI实例,并通过bind方法将我们之前定义的天气工具绑定到这个模型上。然后,我们通过调用invoke方法并传递一个询问天气的问题来使用这个工具。

结果

当模型被调用时,它会解析传入的问题,并根据绑定的工具执行相应的操作。在我们的例子中,模型会识别出问题中的地点(SF、NYC和LA),并使用绑定的get_current_weather工具来获取这些地点的当前天气信息。

复制# 假设的输出结果{    "content": '',    "additional_kwargs": {        "tool_calls": [            {                "id": 'call_zHN0ZHwrxM7nZDdqTp6dkPko',                "function": {                    "arguments": '{"location": "San Francisco, CA", "unit": "celsius"}',                    "name": "get_current_weather"                },                "type": "function"            },            {                "id": 'call_aqdMm9HBSlFW9c9rqxTa7eQv',                "function": {                    "arguments": '{"location": "New York, NY", "unit": "celsius"}',                    "name": "get_current_weather"                },                "type": "function"            },            {                "id": 'call_cx8E567zcLzYV2WSWVgO63f1',                "function": {                    "arguments": '{"location": "Los Angeles, CA", "unit": "celsius"}',                    "name": "get_current_weather"                },                "type": "function"            }        ]    }}

这个输出结果是一个假设的例子,展示了模型如何响应请求并调用绑定的工具。每个tool_call代表对get_current_weather函数的一个调用,包含了地点和单位参数。

通过这种方式,Langchain使得开发者能够轻松地将复杂的功能集成到OpenAI模型中,从而创建更加智能和有用的应用程序。这就像是给AI模型配备了一个多功能的瑞士军刀,让它能够应对各种不同的任务和挑战。

functions 与 toolsfunctions(函数)

functions通常指的是与OpenAI模型直接绑定的自定义函数或操作。这些函数可以是任何由开发者定义的逻辑,它们可以接收特定的输入参数,并返回一个结果。functions通常用于实现特定的业务逻辑或处理复杂的任务,比如解决数学问题、执行文本分析或调用外部API。

在Langchain中,functions通常与模型的bind方法一起使用,以便在模型处理请求时调用这些自定义函数。例如,如果你想要让模型能够解决方程式,你可以定义一个solver函数,并将其绑定到模型上。当模型接收到包含方程式的输入时,它可以调用这个solver函数来找到解决方案。

tools(工具)

tools则是一组预定义的功能或服务,它们通常是由Langchain框架提供或由第三方服务提供商实现的。这些工具可以是用于特定任务的小型应用程序或服务,比如获取天气信息、翻译文本或执行搜索查询。tools的目的是为模型提供即插即用的功能,以便开发者可以快速集成并使用这些服务而无需从头开始编写代码。

在Langchain中,tools也是通过模型的bind方法绑定到模型上的。与functions不同,tools通常不需要开发者提供具体的实现逻辑,而是利用现有的服务或库。例如,如果你想让模型能够回答关于天气的问题,你可以绑定一个天气查询工具,而不是自己编写天气查询的代码。

应用场景functions的应用场景当你需要模型执行特定的业务逻辑或处理复杂任务时。当你想要扩展模型的能力,让它能够处理特定的数据格式或执行特定的计算时。当你想要集成外部API,但需要自定义调用逻辑或参数处理时。tools的应用场景当你想要快速集成一个预定义的服务或功能到你的模型中时。当你需要使用现成的工具来增强模型的交互能力,而无需自己编写复杂的代码时。当你想要利用Langchain框架或第三方提供的功能,如天气查询、翻译服务等时。

总结来说,functions更多地用于自定义逻辑和业务特定的需求,而tools则用于快速集成现成的服务和功能。两者都是Langchain提供的强大工具,可以帮助开发者创建更加智能和多功能的AI应用。

结语

通过Langchain的绑定运行时参数功能,我们可以让代码变得更加灵活和强大。这就像是在编程的世界里,我们可以用同样的咒语,解决各种各样的问题。现在,你已经学会了这个强大的魔法,快去施展它,让你的代码变得更加神奇吧!

标签: #编写程序输入华氏度输出摄氏度