langchain 入门指南 - 函数调用

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: langchain 入门指南 - 函数调用

OpenAI 引入函数调用(function calling)功能是为了增强其语言模型的能力,使其能够执行更复杂、更具体的任务。

通过函数调用,模型可以与外部软件、数据库或其他服务进行交互,从而执行计算、查询信息、执行操作等。

以下是函数调用的一些潜在好处:

  1. 扩展能力:函数调用允许模型执行超出其预训练知识范围的任务,例如实时数据检索、执行复杂计算等。
  2. 实时数据:模型可以访问最新的数据,而不是仅仅依赖于训练时所学的知识。
  3. 定制化服务:通过调用特定函数,用户可以根据自己的需求定制模型的行为,使其更好地适应特定的应用场景。
  4. 安全性与隐私:在某些情况下,函数调用可以提供更安全的数据处理方式,例如在本地执行敏感数据的操作,而不是将数据发送到外部服务器。
  5. 效率提升:对于需要大量计算的任务,函数调用可以利用外部服务的高效计算能力,而不是仅仅依赖于模型的内部处理。
  6. 灵活性:函数调用使得模型可以与各种外部系统集成,从而提供更加灵活和多样化的服务。

总之,函数调用是 OpenAI 为了提高其语言模型的实用性和灵活性而采取的一种策略,它使得模型能够更好地与外部世界交互,执行更复杂的任务,并为用户提供更加定制化和高效的服务。

函数调用的流程

  1. 将使用方法(工具)说明随用户请求一起放在 Prompt 中传给 GPT。
  2. GPT 返回要调用的方法名及参数值,然后在外部运行该方法获得结果。
  3. 将调用结果及前面的对话历史一起放入 Prompt,再次调用 GPT。

函数调用实现基本思路

  • 构建一个 dict 对象存储方法名及其对应的函数。
  • Prompt 中加入方法定义
  • 根据 LLM 的返回,决定是否调用函数(返回信息中含有 “function_call”),还是直接返回信息给用户
  • 如需调用函数,则调用 LLM 指定函数,并将结果及调用的函数一起放在 Prompt 中再次调用 LLM。

示例

下面的示例中:

  • query_weather 是查询天气的函数,写死了返回值。在实际应用中可以调用天气 API 来获取实时天气信息。
  • query 是我们要询问 LLM 的方法。
import json
from openai import OpenAI
from openai.types.chat import ChatCompletionMessage
client = OpenAI(
    api_key="your key",
    base_url="https://api.openai-hk.com/v1"
)
def query_weather(question):
    print(f'calling query_weather. question: {question}')
    return "今天广州天气晴朗,26~35摄氏度。"
funcs = {'query_weather': query_weather}
def query(msg: list) -> ChatCompletionMessage:
    response = client.chat.completions.create(
        model='gpt-4',
        messages=msg,
        functions=[
            {
                "name": "query_weather",
                "description": "如果需要查询天气,则调用",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "question": {
                            "type": "string",
                            "description": "问题"
                        }
                    },
                    "required": ["question"]
                }
            }
        ],
        function_call="auto"
    )
    message = response.choices[0].message
    # 如果不需要调用 function,则直接返回结果
    if not message.function_call:
        return message
    # 调用 function
    print('calling function.')
    function_name = message.function_call.name
    function_args = json.loads(message.function_call.arguments)
    # 执行调用
    res = funcs[function_name](**function_args)
    msg.append({
        'role': 'function',
        'name': function_name,
        'content': res,
    })
    return query(msg)
res1 = query([{'role': 'user', 'content': '今天广州适合穿什么?'}])
print(res1.content)

说明:

  • query_weather 是一个查询天气的函数,接收一个问题参数,返回天气信息。例子中写死了。
  • 我们需要使用 OpenAI.chat.completions.create 方法来做有 function calling 的操作。
  • 使用了 gpt-4 模型,因为 gpt-3.5-turbo 并不能根据我的问题来推理出需要查询广州的天气。
  • 在函数调用之后,我们会将函数调用的结果及函数名一起放入 Prompt 中再次调用 LLM。
  • 最终 LLM 能根据我们的问题,以及函数调用的结果,告诉我们广州今天的天气适合穿什么。

实际过程其实是,我们告诉了 GPT 一些可以使用的工具,然后 GPT 可以推理出什么时候以及用什么参数来调用这些工具,从而得到我们想要的结果。

如果需要 GPT 精确地调用某个函数,我们需要在 create 方法中传递参数地时候就描述清除方法在什么时候调用,以及函数地目的是什么,参数是什么,参数的作用是什么等。

应用:让 LLM 帮助我们实时搜索

我们可以使用前面文章提到过的 GoogleSerperAPIWrapper 来帮助我们完成搜索任务。

import json
from openai import OpenAI
from openai.types.chat import ChatCompletionMessage
client = OpenAI(
    api_key="your key",
    base_url="https://api.openai-hk.com/v1"
)
import os
# https://serper.dev
os.environ['SERPER_API_KEY'] = 'your serper api key'
from langchain_community.utilities import GoogleSerperAPIWrapper
def query_web(question):
    search = GoogleSerperAPIWrapper()
    res = search.run(question)
    print(f"calling query_web. question: {question}, res: {res}")
    return res
funcs = {'query_web': query_web}
def query(msg: list) -> ChatCompletionMessage:
    response = client.chat.completions.create(
        model='gpt-4',
        messages=msg,
        functions=[
            {
                "name": "query_web",
                "description": "如果需要查询一些实时信息,你可以调用这个函数",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "question": {
                            "type": "string",
                            "description": "问题"
                        }
                    },
                    "required": ["question"]
                }
            }
        ],
        function_call="auto"
    )
    message = response.choices[0].message
    # 如果不需要调用 function,则直接返回结果
    if not message.function_call:
        return message
    # 调用 function
    print('calling function.')
    function_name = message.function_call.name
    function_args = json.loads(message.function_call.arguments)
    # 执行调用
    res = funcs[function_name](**function_args)
    msg.append({
        'role': 'function',
        'name': function_name,
        'content': res,
    })
    return query(msg)
res1 = query([{'role': 'user', 'content': '今天广州适合穿什么?'}])
print(res1.content)

这个例子跟上面的例子差不多,只是这个例子中,我们做了实时的搜索,而不是写死了返回值。

输出:

calling function.
calling query_web. question: 今天广州的天气情况, res: 84°F
今天广州的温度约为29°C,适宜穿短袖、短裤、裙子等清凉的夏季服装。
出门的时候可能要带一把伞,避免炎热的阳光或突然的暴雨。

我们可以问一下实时性更强的问题:

res1 = query([{'role': 'user', 'content': '2024 欧洲杯冠军是哪个国家?'}])
print(res1.content)

输出:

calling function.
calling query_web. question: 2024 欧洲杯冠军是哪个国家?, res: 明智 责编:胡军华举报 据央视新闻,当地时间7月14日(中国时间7月15日),在德国柏林举行的2024欧洲杯决赛中,西班牙2:1战胜英格兰夺得冠军。 值得一提的是,本届欧洲杯西班牙7场比赛全胜,创造了赛事历史。
2024年欧洲杯的冠军是西班牙。

可以看到,我们可以通过 LLM 来实时搜索一些信息。

通过这种方式,我们就等于在一定程度上拓展了 LLM 的能力,因为它获取信息的渠道不只是之前训练时用的数据了。

总结

函数调用是 OpenAI 为了提高其语言模型的实用性和灵活性而采取的一种策略,

它使得模型能够更好地与外部世界交互,执行更复杂的任务,并为用户提供更加定制化和高效的服务。


相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
1月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
267 2
|
3月前
langchain 入门指南 - 使用 Agent
langchain 入门指南 - 使用 Agent
156 0
|
3月前
|
机器学习/深度学习
langchain 入门指南 - In-context Learning
langchain 入门指南 - In-context Learning
96 0
|
3月前
langchain 入门指南 - 链式请求
langchain 入门指南 - 链式请求
72 0
|
1月前
|
人工智能 前端开发 JavaScript
前端大模型入门(二):掌握langchain的核心Runnable接口
Langchain.js 是 Langchain 框架的 JavaScript 版本,专为前端和后端 JavaScript 环境设计。最新 v0.3 版本引入了强大的 Runnable 接口,支持灵活的执行方式和异步操作,方便与不同模型和逻辑集成。本文将详细介绍 Runnable 接口,并通过实现自定义 Runnable 来帮助前端人员快速上手。
|
3月前
|
存储 机器学习/深度学习 传感器
langchain 入门指南 - 实现一个多模态 chatbot
langchain 入门指南 - 实现一个多模态 chatbot
115 0
|
3月前
|
前端开发 人机交互
langchain 入门指南 - ReAct 模式
langchain 入门指南 - ReAct 模式
93 1
|
3月前
|
存储 人工智能 缓存
langchain 入门指南 - 让 AI 记住你说过的话
langchain 入门指南 - 让 AI 记住你说过的话
117 1
|
3月前
|
人工智能 搜索推荐 API
langchain 入门指南 - 让 AI 从互联网获取信息
langchain 入门指南 - 让 AI 从互联网获取信息
84 1
|
3月前
|
Linux
langchain 入门指南 - 使用提示词模板
langchain 入门指南 - 使用提示词模板
176 1