构建LangChain应用程序的示例代码:60、探索 OpenAI V1 新功能及其在 LangChain 中的应用

示例展示了OpenAI最新发布的一些重要功能,包括视觉处理、Assistants API、JSON模式、系统指纹等,以及如何在LangChain中使用这些功能。它还介绍了一些与Azure相关的重大变更,以及如何使用工具进行并行函数调用。这些新功能和变更为开发更复杂、更强大的AI应用程序提供了更多可能性。

探索 OpenAI V1 功能

2023年11月6日,OpenAI发布了一些新功能,并将其Python SDK版本升级到1.0.0。示例展示了新功能以及如何在LangChain中使用它们。

# 需要 openai>=1.1.0, langchain>=0.0.335, langchain-experimental>=0.0.39
!pip install -U openai langchain langchain-experimental# 安装或升级必要的库
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI# 导入必要的类

视觉功能

OpenAI发布了多模态模型,可以接受文本和图像序列作为输入。

chat = ChatOpenAI(model="gpt-4-vision-preview", max_tokens=256)
chat.invoke([HumanMessage(content=[{"type": "text", "text": "这张图片显示了什么"},{"type": "image_url","image_url": {"url": "https://raw.githubusercontent.com/langchain-ai/langchain/master/docs/static/img/langchain_stack.png","detail": "auto",},},])]
)# 创建一个支持视觉功能的ChatOpenAI实例
# 使用模型处理包含文本和图像的消息

OpenAI assistants

Assistants API允许您在自己的应用程序中构建AI助手。Assistant有指令,可以利用模型、工具和知识来响应用户查询。Assistants API目前支持三种类型的工具:代码解释器、检索和函数调用。

您可以使用OpenAI工具或自定义工具与OpenAI Assistants交互。当仅使用OpenAI工具时,您可以直接调用assistant并获得最终答案。当使用自定义工具时,您可以使用内置的AgentExecutor运行assistant和工具执行循环,或轻松编写自己的执行器。

以下我们展示了与Assistants交互的不同方式。作为一个简单的例子,让我们构建一个可以编写和运行代码的数学辅导员。

仅使用OpenAI工具

from langchain.agents.openai_assistant import OpenAIAssistantRunnable# 导入OpenAIAssistantRunnable类
interpreter_assistant = OpenAIAssistantRunnable.create_assistant(name="langchain assistant",instructions="你是一个个人数学辅导员。编写并运行代码来回答数学问题。",tools=[{"type": "code_interpreter"}],model="gpt-4-1106-preview",
)
output = interpreter_assistant.invoke({"content": "10减去4的2.7次方是多少"})
output# 创建一个具有代码解释器功能的assistant
# 使用assistant回答数学问题

作为具有任意工具的LangChain agent

现在让我们使用我们自己的工具重新创建这个功能。对于这个例子,我们将使用E2B沙盒运行时工具。

!pip install e2b duckduckgo-search# 安装必要的库
from langchain.tools import DuckDuckGoSearchRun, E2BDataAnalysisTooltools = [E2BDataAnalysisTool(api_key="..."), DuckDuckGoSearchRun()]# 创建工具列表,包括E2B数据分析工具和DuckDuckGo搜索工具
agent = OpenAIAssistantRunnable.create_assistant(name="langchain assistant e2b tool",instructions="你是一个个人数学辅导员。编写并运行代码来回答数学问题。你也可以搜索互联网。",tools=tools,model="gpt-4-1106-preview",as_agent=True,
)# 创建一个具有自定义工具的assistant
使用AgentExecutor
from langchain.agents import AgentExecutoragent_executor = AgentExecutor(agent=agent, tools=tools)
agent_executor.invoke({"content": "今天旧金山的天气除以2.7是多少"})# 创建AgentExecutor并使用它来执行任务
自定义执行
agent = OpenAIAssistantRunnable.create_assistant(name="langchain assistant e2b tool",instructions="你是一个个人数学辅导员。编写并运行代码来回答数学问题。",tools=tools,model="gpt-4-1106-preview",as_agent=True,
)# 创建一个新的assistant实例
from langchain_core.agents import AgentFinishdef execute_agent(agent, tools, input):tool_map = {tool.name: tool for tool in tools}response = agent.invoke(input)while not isinstance(response, AgentFinish):tool_outputs = []for action in response:tool_output = tool_map[action.tool].invoke(action.tool_input)print(action.tool, action.tool_input, tool_output, end="\n\n")tool_outputs.append({"output": tool_output, "tool_call_id": action.tool_call_id})response = agent.invoke({"tool_outputs": tool_outputs,"run_id": action.run_id,"thread_id": action.thread_id,})return response# 定义一个自定义的执行函数来运行agent
response = execute_agent(agent, tools, {"content": "10减去4的2.7次方是多少"})
print(response.return_values["output"])# 使用自定义执行函数运行agent并打印结果
next_response = execute_agent(agent, tools, {"content": "现在加上17.241", "thread_id": response.thread_id}
)
print(next_response.return_values["output"])# 继续对话,使用相同的线程ID

JSON模式

限制模型只生成有效的JSON。注意,您必须包含一个带有使用JSON指令的系统消息,这个模式才能工作。

仅适用于某些模型。

chat = ChatOpenAI(model="gpt-3.5-turbo-1106").bind(response_format={"type": "json_object"}
)output = chat.invoke([SystemMessage(content="从以下陈述中提取任何提到的公司的'名称'和'起源'。返回一个JSON列表。"),HumanMessage(content="Google成立于美国,而Deepmind成立于英国"),]
)
print(output.content)# 创建一个设置为JSON模式的ChatOpenAI实例
# 使用它来生成JSON格式的响应
import jsonjson.loads(output.content)# 解析JSON响应

系统指纹

OpenAI有时会以影响输出的方式更改模型配置。每当这种情况发生时,与生成相关的system_fingerprint将会改变。

chat = ChatOpenAI(model="gpt-3.5-turbo-1106")
output = chat.generate([[SystemMessage(content="从以下陈述中提取任何提到的公司的'名称'和'起源'。返回一个JSON列表。"),HumanMessage(content="Google成立于美国,而Deepmind成立于英国"),]]
)
print(output.llm_output)# 使用ChatOpenAI生成响应并打印llm_output,其中包含system_fingerprint

Azure类的重大变更

OpenAI V1重写了他们的客户端,并分离了Azure和OpenAI客户端。这导致在使用OpenAI V1时LangChain接口发生了一些变化。

重大变更:

  • 要在OpenAI V1中使用Azure嵌入,您需要使用新的AzureOpenAIEmbeddings而不是现有的OpenAIEmbeddings。当使用Azure和openai<1时,OpenAIEmbeddings继续工作。
from langchain_openai import AzureOpenAIEmbeddings

推荐的变更:

  • 当使用AzureChatOpenAIAzureOpenAI时,如果传入Azure端点(例如https://example-resource.azure.openai.com/),应该通过azure_endpoint参数或AZURE_OPENAI_ENDPOINT指定。我们暂时保持通过openai_api_base/base_url或环境变量OPENAI_API_BASE指定的向后兼容性,但不应依赖这种方式。
  • 当使用Azure聊天或嵌入模型时,通过openai_api_key参数或AZURE_OPENAI_API_KEY参数传入API密钥。我们暂时保持通过OPENAI_API_KEY指定的向后兼容性,但不应依赖这种方式。

工具

使用工具进行并行函数调用。

from typing import Literalfrom langchain.output_parsers.openai_tools import PydanticToolsParser
from langchain.utils.openai_functions import convert_pydantic_to_openai_tool
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Fieldclass GetCurrentWeather(BaseModel):"""获取某个地点的当前天气。"""location: str = Field(description="城市和州,例如 San Francisco, CA")unit: Literal["celsius", "fahrenheit"] = Field(default="fahrenheit", description="温度单位,默认为华氏度")prompt = ChatPromptTemplate.from_messages([("system", "你是一个有帮助的助手"), ("user", "{input}")]
)
model = ChatOpenAI(model="gpt-3.5-turbo-1106").bind(tools=[convert_pydantic_to_openai_tool(GetCurrentWeather)]
)
chain = prompt | model | PydanticToolsParser(tools=[GetCurrentWeather])chain.invoke({"input": "纽约、洛杉矶和旧金山的天气如何"})# 定义一个用于获取天气的Pydantic模型
# 创建一个提示模板
# 创建一个带有工具的ChatOpenAI模型
# 构建一个链来处理输入、使用模型和解析输出
# 调用链来获取多个城市的天气

内容总结

这个文档详细介绍了 OpenAI 在 2023 年 11 月 6 日发布的新功能,以及如何在 LangChain 框架中使用这些功能。主要内容包括:

  1. 视觉功能:多模态模型,可处理文本和图像输入。
  2. OpenAI Assistants:新的 API,允许构建具有指令、工具和知识的 AI 助手。
  3. JSON 模式:限制模型只生成有效的 JSON 输出。
  4. 系统指纹:用于跟踪模型配置变更对输出的影响。
  5. Azure 类的重大变更:包括新的 AzureOpenAIEmbeddings 类和参数变更。
  6. 工具使用:展示了如何使用工具进行并行函数调用。

文档还提供了每个新功能的代码示例,展示了如何在 LangChain 中实现这些功能。

扩展知识

  1. 多模态 AI:

    • 多模态 AI 是指能够处理和理解多种类型数据(如文本、图像、音频)的 AI 系统。
    • 这种技术在诸如图像描述、视觉问答等任务中有广泛应用。
    • 未来可能会扩展到更复杂的任务,如视频理解或跨模态推理。
  2. AI Assistants:

    • AI Assistants 代表了 AI 应用的一个重要趋势,即创建更加个性化和上下文感知的 AI 系统。
    • 这种技术可以应用于客户服务、个人助理、教育辅导等多个领域。
    • 未来的发展可能包括更强的记忆能力和跨会话学习能力。
  3. 结构化输出:

    • JSON 模式等结构化输出技术对于创建可靠的 AI API 至关重要。
    • 这种方法可以确保 AI 输出的一致性和可解析性,便于与其他系统集成。
    • 未来可能会看到更多类型的结构化输出格式,以适应不同的应用需求。
  4. 系统指纹:

    • 系统指纹技术有助于提高 AI 系统的可追溯性和可重现性。
    • 这对于科学研究、审计和持续改进 AI 模型非常重要。
    • 未来可能会看到更细粒度的版本控制和变更跟踪机制。
  5. 云 AI 服务集成:

    • Azure 类的变更反映了云 AI 服务与开源框架(如 LangChain)之间更紧密的集成。
    • 这种趋势将继续,使得在云环境中部署和扩展 AI 应用变得更加容易。
  6. 工具使用和函数调用:

    • 允许 AI 模型使用外部工具和函数是提高其能力和实用性的重要方向。
    • 这种方法可以将 AI 的推理能力与特定领域的专业知识和功能相结合。
    • 未来可能会看到更复杂的工具使用策略,如多步规划和工具组合。

通过这些新功能和集成,开发者可以创建更强大、更灵活的 AI 应用,推动 AI 技术在各个领域的应用和创新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/869170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

☺初识c++(语法篇)☺

目录 一命名空间&#xff08;namespace&#xff09;&#xff1a; 二cout与cin简述&#xff1a; 三缺省参数&#xff1a; 四函数重载&#xff1a; 五引用&#xff1a; 六内联函数: 七c中的nullptr简述&#xff1a; 一命名空间&#xff08;namespace&#xff09;&#xff1…

源码编译安装 LAMP

源码编译安装 LAMP Apache 网站服务基础Apache 简介安装 httpd 服务器 httpd 服务器的基本配置Web 站点的部署过程httpd.conf 配置文件 构建虚拟 Web 主机基于域名的虚拟主机基于IP 地址、基于端口的虚拟主机 MySQL 的编译安装构建 PHP 运行环境安装PHP软件包设置 LAMP 组件环境…

住宅代理、移动代理和数据中心代理之间的区别

如果您是一名认真的互联网用户&#xff0c;可能需要反复访问某个网站或服务器&#xff0c;可能是为了数据抓取、价格比较、SEO 监控等用例&#xff0c;而不会被 IP 列入黑名单或被 CAPTCHA 阻止。 代理的工作原理是将所有传出数据发送到代理服务器&#xff0c;然后代理服务器将…

mysql数据库的搭建和操作

mysql数据库的搭建和操作 1: 去官网下载mysql的服务端: https://www.mysql.com/ 下载mysql服务器 2: 安装好mysql服务,设置好初始化的根用户密码: 记住根用户的密码; 3: windows 启动服务: mysql notifier或windows服务管理器启动; 4: mysql客户端: Mac OS: Sequel Pro/命令行…

LeetCode每日一题 分发糖果

题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计算并返回…

Vuforia AR篇(八)— AR塔防上篇

目录 前言一、设置Vuforia AR环境1. 添加AR Camera2. 设置目标图像 二、创建塔防游戏基础1. 导入素材2. 搭建场景3. 创建敌人4. 创建脚本 前言 在增强现实&#xff08;AR&#xff09;技术快速发展的今天&#xff0c;Vuforia作为一个强大的AR开发平台&#xff0c;为开发者提供了…

maven项目读取文件错误

开发工具&#xff1a;idea 一个简单的maven项目&#xff0c;程序读取不到src/main/resources目录下的文件 寻找了一些原因后&#xff0c;还是没解决&#xff0c;最后灵机一动改了设置居然好了。 然后就解决了

怎样把图片转成pdf文件,简鹿格式工厂轻松批量搞定

信息的存储和分享方式变得越来越多样化&#xff0c;而PDF文件以其跨平台兼容性和内容完整性&#xff0c;成为了许多用户首选的文档格式。无论是在学术研究、商务办公&#xff0c;还是个人创作中&#xff0c;将图片转换为PDF文件的需求日益凸显。 想象一下&#xff0c;当你需要整…

258. 各位相加

哈喽&#xff01;大家好&#xff0c;我是奇哥&#xff0c;一位专门给面试官添堵的职业面试员 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】更有我为大家准备的福利哟&#xff01; 文章目录 一、题目二、答案三、总结 给定一个非…

vue学习day04-计算属性、computed计算属性与methods方法、计算属性完整写法

10、计算属性 &#xff08;1&#xff09;概念&#xff1a; 基于现有的数据&#xff0c;计算出来的新属性。依赖于数据变化&#xff0c;自动重新计算。 &#xff08;计算属性->可以将一段求值的代码进行封装&#xff09; &#xff08;2&#xff09;语法&#xff1a; 1&a…

C++:cv::Mat的列数与行数属性

在OpenCV中&#xff0c;cv::Mat 类是一个非常核心的数据结构&#xff0c;用于存储图像或数值数据。这个类提供了丰富的功能来操作这些数据&#xff0c;包括访问、修改和转换数据等。cv::Mat 类的 cols 和 rows 属性分别代表矩阵&#xff08;或图像&#xff09;的列数和行数。 c…

Android中android.content.res.Resources$NotFoundException的问题

最近在调试程序的时候发现一个比较诡异的问题。 E FATAL EXCEPTION: main Process: com.eathemeat.justplayer, PID: 22047 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.eathemeat.justplayer/com.eathemeat.justplayer.play.PlayActivity}: an…

已解决java.sql.SQLNonTransientConnectionException: Cannot load connection class because of underly,亲测有效

文章目录 问题分析报错原因解决思路解决方法1. 添加 JDBC 驱动程序到类路径2. 检查数据库连接配置3. 检查版本兼容性4. 检查安全设置5. 清理和重建项目6. 查看日志和异常堆栈 注意事项 java.sql.SQLNonTransientConnectionException: Cannot load connection class because of …

实现桌面动态壁纸(二)

目录 前言 一、关于 WorkerW 工作区窗口 二、关于窗口关系 2.1 窗口以及窗口隶属关系 2.2 桌面管理层窗口组分简析 2.3 厘清两个概念的区别 2.4 关于设置父窗口 三、编写代码以供在 Vista 上实现 3.1 方法二&#xff1a;子类化并自绘窗口背景 四、初步分析桌面管理层…

服务器安装多个Tomcat

服务器安装多个Tomcat 因为申请了一个域名&#xff0c;然后想设置一个二级域名&#xff0c;让不同的二级域名访问到不同的项目&#xff0c;例如blog.booleandev.xyz访问到博客项目&#xff0c;www.booleandev.xyz访问到主页&#xff0c;网上找了找资料&#xff0c;发现一般是使…

STM32的SPI接口详解

目录 1.SPI简介 2.SPI工作原理 3.SPI时序 3.1 CPOL&#xff08;Clock Polarity&#xff0c;时钟极性&#xff09;&#xff1a; 3.2 CPHA&#xff08;Clock Phase&#xff0c;时钟相位&#xff09;&#xff1a; 3.3 四种工作模式 4.相关代码 4.1使能片选信号 4.2使能通…

SQL注入如何判断数据库类型

前言 在进行SQL注入之前&#xff0c;首先应该判断数据库的类型&#xff0c;不同的数据库在处理一些函数的时候会有一些微妙的差别&#xff0c;只有判断出是哪种数据库类型&#xff0c;这样才能根据数据库的类型选择合适的函数&#xff0c;更容易实现SQL注入。 # 前端与数据库…

初步理解三__《面向互联网大数据的威胁情报 并行挖掘技术研究》

初步理解三 5类战术标签 gtp 收集开源的网络安全报告并将其转化为统一的文本格式&#xff0c;并且标注了5类战术标签是一个涉及到数据处理和分类的复杂任务。以下是一种可能的处理方法&#xff1a; 数据收集和整合&#xff1a; 使用网络爬虫或API访问工具收集开源的网络安全…

收银系统源代码-收银端UI风格

智慧新零售收银系统是一套线下线上一体化收银系统&#xff0c;给商户提供含线下收银称重、线上商城、精细化会员管理、ERP进销存、丰富营销活动、移动店务助手等一体化的解决方案。 如Windows版收银&#xff08;exe安装包&#xff09;、安卓版收银&#xff08;apk安装包&#…

什么是 YAML?了解 YAML 语法与最佳实践

什么是 YAML YAML 是 "YAML Aint Markup Language" 的缩写&#xff0c;这是一种用于数据序列化的基于文本的标记语言。 YAML 的用途 YAML (YAML Aint Markup Language) 是一种人类可读的数据序列化格式&#xff0c;主要用于以下目的&#xff1a; 作为配置文件格式…