构建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, 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

推荐的变更:

  • 当使用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 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 框架中使用这些功能。主要内容包括:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hugo_Hoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值