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

构建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 技术在各个领域的应用和创新。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • unity 手动制作天空盒及使用
  • 30 华三华为STP
  • python+django 环境搭建以及post接口封装
  • Java内存区域与内存溢出异常(自动内存管理)
  • 鸿蒙系统创建签名文件及使用创建签名文件打包并安装
  • Labview_Workers5.0 学习笔记
  • 评价ChatGPT与强人工智能的未来
  • 【虚幻引擎】UE4初学者系列教程开发进阶实战篇——生存游戏案例
  • C语言求10进制转2进制(除2取余法)
  • Linux x86_64平台指令替换函数 text_poke_smp/bp
  • python的魔法方法
  • 虚拟现实3d场景漫游体验实现了“所见即所得”
  • TCP粘包
  • 如何搭建一个新生录取查询系统
  • pytorch通过 tensorboardX 调用 Tensorboard 进行可视化
  • 【译】JS基础算法脚本:字符串结尾
  • 【笔记】你不知道的JS读书笔记——Promise
  • js正则,这点儿就够用了
  • mockjs让前端开发独立于后端
  • QQ浏览器x5内核的兼容性问题
  • Rancher如何对接Ceph-RBD块存储
  • swift基础之_对象 实例方法 对象方法。
  • 阿里云Kubernetes容器服务上体验Knative
  • 大整数乘法-表格法
  • 工作中总结前端开发流程--vue项目
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 排序算法之--选择排序
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 优化 Vue 项目编译文件大小
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #NOIP 2014# day.2 T2 寻找道路
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (LLM) 很笨
  • (poj1.2.1)1970(筛选法模拟)
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (接口自动化)Python3操作MySQL数据库
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)Dubbo快速入门、介绍、使用
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转) 深度模型优化性能 调参
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ..回顾17,展望18
  • .net core docker部署教程和细节问题
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET开源、简单、实用的数据库文档生成工具