示例展示了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, E2BDataAnalysisTool
tools = [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 AgentExecutor
agent_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 AgentFinish
def 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 json
json.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
推荐的变更:
- 当使用
AzureChatOpenAI
或AzureOpenAI
时,如果传入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 Literal
from 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, Field
class 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 框架中使用这些功能。主要内容包括:
- 视觉功能:多模态模型,可处理文本和图像输入。
- OpenAI Assistants:新的 API,允许构建具有指令、工具和知识的 AI 助手。
- JSON 模式:限制模型只生成有效的 JSON 输出。
- 系统指纹:用于跟踪模型配置变更对输出的影响。
- Azure 类的重大变更:包括新的
AzureOpenAIEmbeddings
类和参数变更。 - 工具使用:展示了如何使用工具进行并行函数调用。
文档还提供了每个新功能的代码示例,展示了如何在 LangChain 中实现这些功能。
扩展知识
-
多模态 AI:
- 多模态 AI 是指能够处理和理解多种类型数据(如文本、图像、音频)的 AI 系统。
- 这种技术在诸如图像描述、视觉问答等任务中有广泛应用。
- 未来可能会扩展到更复杂的任务,如视频理解或跨模态推理。
-
AI Assistants:
- AI Assistants 代表了 AI 应用的一个重要趋势,即创建更加个性化和上下文感知的 AI 系统。
- 这种技术可以应用于客户服务、个人助理、教育辅导等多个领域。
- 未来的发展可能包括更强的记忆能力和跨会话学习能力。
-
结构化输出:
- JSON 模式等结构化输出技术对于创建可靠的 AI API 至关重要。
- 这种方法可以确保 AI 输出的一致性和可解析性,便于与其他系统集成。
- 未来可能会看到更多类型的结构化输出格式,以适应不同的应用需求。
-
系统指纹:
- 系统指纹技术有助于提高 AI 系统的可追溯性和可重现性。
- 这对于科学研究、审计和持续改进 AI 模型非常重要。
- 未来可能会看到更细粒度的版本控制和变更跟踪机制。
-
云 AI 服务集成:
- Azure 类的变更反映了云 AI 服务与开源框架(如 LangChain)之间更紧密的集成。
- 这种趋势将继续,使得在云环境中部署和扩展 AI 应用变得更加容易。
-
工具使用和函数调用:
- 允许 AI 模型使用外部工具和函数是提高其能力和实用性的重要方向。
- 这种方法可以将 AI 的推理能力与特定领域的专业知识和功能相结合。
- 未来可能会看到更复杂的工具使用策略,如多步规划和工具组合。
通过这些新功能和集成,开发者可以创建更强大、更灵活的 AI 应用,推动 AI 技术在各个领域的应用和创新。