首页  >  文章  >  Java  >  使用 Java Quarkus Langchain 构建可靠的 AI 代理 - 部分 AI 即服务

使用 Java Quarkus Langchain 构建可靠的 AI 代理 - 部分 AI 即服务

Susan Sarandon
Susan Sarandon原创
2024-10-27 08:53:30992浏览

作者

@herbertbeckman - LinkedIn
@rndtavares - LinkedIn

文章部分内容

  1. 使用 Java Quarkus Langchain4j 生产的可靠 AI 代理 - 第 1 部分 - AI 即服务(本文)

  2. Java Quarkus Langchain4j 产品中的可靠 AI 代理 - 第 2 部分 - 内存(即将推出)

  3. 使用 Java Quarkus Langchain4j 生产的可靠 AI 代理 - 第 3 部分 - RAG(即将推出)

  4. 使用 Java Quarkus Langchain4j 生产的可靠 AI 代理 - 第 4 部分 - Guardrails(即将推出)

介绍

每当新兴技术蓬勃发展时,企业都渴望应用它们,并从商业角度获得期待已久的成果。这是创新的竞赛,是争夺先发优势的竞赛。在这场竞争中,原本焦躁不安的公司往往会因为一系列因素而最终放弃,其中一个主要因素就是系统总体的可靠性。人工智能 (AI) 目前正在经历最大的阻力考验之一,作为软件开发人员,我们的工作就是向公司证明,是的,有意识且正确地使用人工智能来执行一系列任务和流程是可能的。 。在本文中,我们将分 3 部分展示生产中的可靠 AI 代理必须具备哪些功能和流程,才能让公司获得期待已久的结果,并共同实施市场上使用的一些概念。我们也会详细说明这个解决方案的注意点,并请开发者尽可能多地进行测试并给我们尽可能多的反馈,以便我们共同进一步提高这一认识。

实现的功能

  • 聊天
  • 工具
  • 聊天记录
  • 检索增强生成(RAG)
  • 护栏

概念和定义

助理、副驾驶、特工

您可能遇到的第一个问题是代理与其他人工智能用例有何不同。代理的功能更多地与自动化相关,而其他代理的活动旨在提供帮助和时间优化。下面我详细介绍每个用例。

助理

助手可以帮助我们并节省我们大量的时间检查信息并成为知识交流的良好来源。他们谈论关于最多样化的主题,当我们需要清晰的推理路线来分析论证的前提时,它们会很有用。当然,他们拥有的权力远不止于此,但我希望您专注于助理的工作:他们与您交谈,仅此而已。他只能可以谈论、总结、细节等。例如:ChatGPT、Claude AI 和 Gemini。

副驾驶

副驾驶比助理稍微强大一些。他们实际上可以做一些事情,更具体的行动,例如实时更改文本和/或建议修改,以及在修改和/或上下文中发生的事件期间提供提示。然而,如前所述,执行此操作取决于上下文,并且并不总是具有提出好的建议所需的所有必要信息,它还取决于您的明确授权,从而形成对用户的直接依赖。很好的例子有:Github Copilot、Codium 和 Microsoft Copilot。

代理商

代理的主要目标是执行目标明确的任务。它的重点是自动化,也就是说,它们实际上自主地完成具体工作。所有这一切只有通过我们为他们提供的工具才能实现。代理不是法学硕士本身,而是协调该法学硕士的应用程序。将法学硕士理解为系统的大脑,负责做出决策,并将其作为该大脑主体的成员进行应用。如果我的手够不到一杯水,那还有什么意义呢?您的代理人赋予 LLM 以安全、可审核且最重要的是可靠的方式做某事的权力。

采取行动

在本文的第一部分中,我们将在项目中实现 AIService,它只不过是与我们的 AI 提供者的接口层。在这个项目中我们使用OpenAI的LLM,但是你可以添加你最喜欢的提供商并基于它调整依赖关系。

现在我们已经明确定义了概念,并且知道我们要在这里做什么,让我们继续编码!

创建项目

创建一个 quarkus 项目,在 Quarkus 中选择依赖管理器和扩展 - 开始编码。

项目依赖

我们将使用maven作为项目的依赖管理器。以下是我们添加的初始依赖项。

马韦姆

<dependency>
  <groupId>io.quarkus</groupId>
  <artifactId>quarkus-websockets-next</artifactId>
</dependency>

<dependency>
  <groupId>io.quarkiverse.langchain4j</groupId>
  <artifactId>quarkus-langchain4j-core</artifactId>
  <version>0.20.3</version>
</dependency>

<dependency>
  <groupId>io.quarkiverse.langchain4j</groupId>
  <artifactId>quarkus-langchain4j-openai</artifactId>
  <version>0.20.3</version>
</dependency>

项目配置

将以下属性添加到 src/main/resources/application.properties 文件:

<dependency>
  <groupId>io.quarkus</groupId>
  <artifactId>quarkus-websockets-next</artifactId>
</dependency>

<dependency>
  <groupId>io.quarkiverse.langchain4j</groupId>
  <artifactId>quarkus-langchain4j-core</artifactId>
  <version>0.20.3</version>
</dependency>

<dependency>
  <groupId>io.quarkiverse.langchain4j</groupId>
  <artifactId>quarkus-langchain4j-openai</artifactId>
  <version>0.20.3</version>
</dependency>

将 YOUR_OPENAPI_KEY_HERE 替换为您在 OpenAI Platform 上注册的密钥 (apiKey)。

提示:在 IDE 中创建一个环境变量,然后将属性 quarkus.langchain4j.openai.api-key 修改为:

quarkus.tls.trust-all=true
quarkus.langchain4j.timeout=60s
quarkus.langchain4j.openai.api-key=YOUR_OPENAI_API_KEY_HERE

创建我们的 AIService

首先我们需要创建 AIService,它将是负责为我们的代理提供“个性”的类。为此,我们将在 src/main/java/ 目录中创建名为 Agent 的类,代码如下:

quarkus.langchain4j.openai.api-key=${OPEN_API_KEY:NAO_ENCONTREI_A_VAR}

正如您从我们的 SystemPrompt (@SystemMessage) 中看到的,我们创建了一个专门从事足球的代理。

创建我们的聊天

现在我们已经创建了代理,我们需要创建一个类来处理与它的聊天。为此,我们将在 src/main/java/ 目录中使用以下代码创建名为 AgentWSEndpoint 的类:

package <seupacote>;

import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import io.quarkiverse.langchain4j.RegisterAiService;
import jakarta.enterprise.context.ApplicationScoped;

@ApplicationScoped
@RegisterAiService
public interface Agent {

    @SystemMessage("""
            Você é um agente especializado em futebol brasileiro, seu nome é FutAgentBR
            Você sabe responder sobre os principais títulos dos principais times brasileiros e da seleção brasileira
            Sua resposta precisa ser educada, você pode deve responder em Português brasileiro e de forma relevante a pergunta feita

            Quando você não souber a resposta, responda que você não sabe responder nesse momento mas saberá em futuras versões.
            """)
    String chat(@UserMessage String message);
}

现在您可以通过 quarkus dev ui 与您的代理(目前仍是助理)交谈。以下是一些可以指导您的印刷品:

Agente de IA confiável em prod com Java   Quarkus   Langchain- Parte  AI as Service

Agente de IA confiável em prod com Java   Quarkus   Langchain- Parte  AI as Service

Agente de IA confiável em prod com Java   Quarkus   Langchain- Parte  AI as Service

Agente de IA confiável em prod com Java   Quarkus   Langchain- Parte  AI as Service

添加我们的工具(函数调用)

现在让我们继续讨论座席和助理之间的区别细节。我们将为我们的代理提供执行任务和/或流程、添加工具(函数调用)的可能性。在我们编写代码之前,我们有一个简短的图形演示如何以宏观方式调用工具。

Agente de IA confiável em prod com Java   Quarkus   Langchain- Parte  AI as Service
来源:surface.ai

现在我们知道工具调用是如何工作的,我们需要使用我们的工具创建类,您也可以为每个工具创建多个不同的类。在这个例子中,我们将创建一个“ToolBox”,即一个工具箱,对我们的代理可以使用的工具进行分组。代码如下:

<dependency>
  <groupId>io.quarkus</groupId>
  <artifactId>quarkus-websockets-next</artifactId>
</dependency>

<dependency>
  <groupId>io.quarkiverse.langchain4j</groupId>
  <artifactId>quarkus-langchain4j-core</artifactId>
  <version>0.20.3</version>
</dependency>

<dependency>
  <groupId>io.quarkiverse.langchain4j</groupId>
  <artifactId>quarkus-langchain4j-openai</artifactId>
  <version>0.20.3</version>
</dependency>

不久之后,我们向代理添加了一个注释,通过 @ToolBox(AgentTools.class) 注释通知它可以使用哪些工具。看起来像这样:

quarkus.tls.trust-all=true
quarkus.langchain4j.timeout=60s
quarkus.langchain4j.openai.api-key=YOUR_OPENAI_API_KEY_HERE

现在您可以询问您的代理现在几点了,今天是几号,请他将两个数字相加并计算平方根。这些是我们在这里用来说明的工具,但您可以将其替换为 HTTP 调用、哈希函数、SQL 查询等。这里的可能性有很多。

通过 Quarkus DEV UI 进行测试

这是添加工具后进行的一项测试的屏幕截图:

Agente de IA confiável em prod com Java   Quarkus   Langchain- Parte  AI as Service

Agente de IA confiável em prod com Java   Quarkus   Langchain- Parte  AI as Service

如您所见,对于每个工具调用,我们都会有一个日志,显示 LLM 实际上调用了我们授权其执行的代码。

后续步骤

我们的代理创建的开始就结束了。我们很快将在本文的第 2 部分中为 Agent 添加内存,在第 3 部分中为 RAG(检索增强生成)添加内存,在第 4 部分中为 Guardrails 添加内存。我希望你喜欢它并很快见到你。

但是您现在可以跟随并查看此 GitHub 存储库中的所有文章的代码。

以上是使用 Java Quarkus Langchain 构建可靠的 AI 代理 - 部分 AI 即服务的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn