利用 Quarkus 和 LangChain4j
1. 概述
在本教程中,我們將了解 LangChain,這是一個用於開發由大型語言模型**(LLM)**支援的應用程式的框架。更具體地說,我們將使用[langchain4j](https://github.com/langchain4j/langchain4j) ,
這是一個 Java 框架,它簡化了與 LangChain 的集成,並允許開發人員將 LLM 整合到他們的應用程式中。
該框架在建立檢索增強生成( RAG )方面**非常流行**。在本文中,我們將了解所有這些術語,並了解如何利用 Quarkus 建立這樣的應用程式。
2. 大型語言模型(LLM)
大型語言模型 (LLM) 是使用大量資料訓練的人工智慧系統。他們的目標是產生類似人類的輸出。 OpenAi 的 GPT-4 可能是當今最知名的法學碩士之一。然而,法學碩士可以回答問題並執行各種自然語言處理任務。
這些模型是強大的聊天機器人、內容生成、文件分析、視訊和圖像生成等的支柱。
2.1.浪鏈
LangChain 是一個受歡迎的開源框架,可協助開發人員建立 LLM 支援的應用程式。它最初是為 Python 開發的,它簡化了使用 LLM 建立多步驟工作流程的過程,例如:
- 與不同的LLM整合:LangChain不服務自己的LLM,而是提供與許多不同LLM互動的標準接口,例如GPT-4 、 Lama-3等
- 整合外部工具:LangChain 可以與對於此類應用程式非常重要的其他工具集成,例如向量資料庫、Web 瀏覽器和其他 API
- 管理記憶體:需要會話流的應用程式需要歷史記錄或上下文持久性。 LangChain具有記憶功能,允許模型在互動過程中「記住」訊息
LangChain 是 Python 開發人員建立人工智慧應用程式的首選框架之一。然而,對於 Java 開發人員來說,LangChain4j 框架為這個強大的框架提供了類似 Java 的改編。
2.2.浪鏈4j
LangChain4j 是一個受 LangChain 啟發的 Java 程式庫,旨在幫助使用 LLM 建立人工智慧驅動的應用程式。這個專案創建者的目標是填補 Java 框架與人工智慧系統的眾多 Python 和 Javascript 選項之間的空白。
LangChain4j 讓 Java 開發人員能夠使用 LangChain 為 Python 開發人員提供的相同工具和靈活性,從而能夠開發聊天機器人、摘要引擎或智慧搜尋系統等應用程式。
可以使用其他框架(例如Quarkus)快速建立功能強大的應用程式。
2.3.誇庫斯
Quarkus 是一個專為雲端原生應用程式設計的 Java 框架。它能夠顯著減少記憶體使用量和啟動時間,使其非常適合微服務、無伺服器架構和 Kubernetes 環境。
將 Quarkus 納入您的 AI 應用程式可確保您的系統具有可擴展性、高效性,並為企業級生產做好準備。此外,Quarkus 提供了易於使用且較低的學習曲線,可將 LangChain4j 整合到我們的 Quarkus 應用程式中。
3. 聊天機器人應用
為了展示 Quarkus 與 LangChain4j 整合的強大功能,我們將創建一個簡單的聊天機器人應用程式來回答有關 Quarkus 的問題。為此,我們使用 GPT-4。這將對我們有所幫助,因為它是用來自互聯網的大量數據進行訓練的,因此,我們不需要訓練我們自己的模型。
該應用程式只會回答有關 Quarkus 的問題,並且會記住特定聊天中先前的對話。
3.1.依賴關係
現在我們已經介紹了主要概念和工具,讓我們使用 LangChain4j 和 Quarkus 來建立我們的第一個應用程式。首先,讓我們使用 Rest 和Redis創建 Quarkus 應用程序,然後添加以下依賴項:
<dependency>
<groupId>io.quarkiverse.langchain4j</groupId>
<artifactId>quarkus-langchain4j-openai</artifactId>
<version>0.18.0.CR1</version>
</dependency>
<dependency>
<groupId>io.quarkiverse.langchain4j</groupId>
<artifactId>quarkus-langchain4j-memory-store-redis</artifactId>
<version>0.18.0.CR1</version>
</dependency>
第一步是將最新的[quarkus-langchain4j-openai](https://mvnrepository.com/artifact/io.quarkiverse.langchain4j/quarkus-langchain4j-openai)
和[quarkus-langchain4j-memory-store-redis](https://mvnrepository.com/artifact/io.quarkiverse.langchain4j/quarkus-langchain4j-memory-store-redis)
依賴項新增到我們的 pom.xml 中
第一個依賴將引入LangChain4J版本,該版本與Quarkus相容。此外,它將為我們提供開箱即用的元件,將 LangChain4J 配置為使用OpenAI LLM 模型作為我們服務的支柱。有許多 LLM 可供選擇,但為了簡單起見,我們使用目前的預設值,即GPT-4o-mini 。為了使用這樣的服務,我們需要在 OpenAI 中建立一個 ApiKey。一旦完成,我們就可以繼續。稍後我們將討論第二個依賴項。
3.2.設定
現在,讓我們設定我們的應用程式以允許它與 GPT-4 和 Redis 進行通信,以便我們可以開始實現我們的聊天機器人。為此,我們需要在 Quarkus 中配置一些應用程式屬性,因為它具有開箱即用的元件來執行此操作。我們只需要將以下屬性新增到application.properties
檔案:
quarkus.langchain4j.openai.api-key=${OPEN_AI_KEY}
quarkus.langchain4j.openai.organization-id=${OPEN_AI_ORG}
quarkus.redis.hosts=${REDIS_HOST}
Quarkus對此應用還有許多其他有價值的配置。請參閱Quarkus 文件;然而,這對我們的聊天機器人來說已經足夠了。
或者,我們也可以使用環境變數來設定以下屬性:
QUARKUS_REDIS_HOSTS: redis://localhost:6379
QUARKUS_LANGCHAIN4J_OPENAI_API_KEY: changeme
QUARKUS_LANGCHAIN4J_OPENAI_ORGANIZATION_ID: changeme
3.3.成分
LangChain4j提供了豐富的功能來幫助我們實現複雜的流程,例如文件檢索。儘管如此,在本文中,我們將重點放在簡單的對話流程上。話雖如此,讓我們創建簡單的聊天機器人:
@Singleton
@RegisterAiService
public interface ChatBot {
@SystemMessage("""
During the whole chat please behave like a Quarkus specialist and only answer directly related to Quarkus,
its documentation, features and components. Nothing else that has no direct relation to Quarkus.
""")
@UserMessage("""
From the best of your knowledge answer the question below regarding Quarkus. Please favor information from the following sources:
- https://docs.quarkiverse.io/
- https://quarkus.io/
And their subpages. Then, answer:
---
{question}
---
""")
String chat(@MemoryId UUID memoryId, String question);
}
在ChatBot
類別中,我們註冊了一個將在對話期間使用 LLM 的服務。為此,Quarkus 提供了@RegisterAiService
註釋,它抽象化了整合 LangChain4J 和 GTP-4 的設定。接下來,我們應用一些提示工程來建立我們希望聊天機器人的行為。
簡而言之,提示工程是一種塑造指令的技術,可幫助法學碩士在解釋和處理使用者請求期間調整其行為。
因此,使用此類提示,我們為機器人實現了所需的行為。 LangChain4J 使用訊息來做到這一點,而:
-
SystemMessage
是影響模型回應的內部指令,但對最終使用者隱藏; -
UserMessage
是最終用戶發送的訊息。然而,LangChain4J 幫助我們,允許我們在此類訊息之上應用模板來增強提示。
接下來我們討論@MemoryId
.
3.4.記憶
儘管法學碩士非常擅長生成文本並提供相關問題的答案,但法學碩士本身不足以實現聊天機器人。法學碩士無法自行完成的關鍵方面是記住先前訊息中的上下文或數據。這就是為什麼我們需要記憶能力。
LangChain4J 提供了抽象化ChatMemoryStore
和ChatMemory.
這些抽象允許不同的實作來儲存和管理表示聊天的訊息清單。另外,還需要一個識別碼來儲存和檢索聊天內存, @MemoryId
用於標記這樣的ID。
Quarkus 為聊天記憶體提供了一個開箱即用的基於 Redis 的實現,這就是我們添加第二個依賴項和 Redis 設定的原因。
3.5.應用程式介面
最後,我們的範例聊天機器人應用程式缺少的是一個使用戶能夠與系統進行通訊的介面。讓我們創建一個 API,以便用戶可以將他們的問題發送到我們的聊天機器人。
@Path("/chat")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ChatAPI {
private ChatBot chatBot;
public ChatAPI(ChatBot chatBot) {
this.chatBot = chatBot;
}
@POST
public Answer mesage(@QueryParam("q") String question, @QueryParam("id") UUID chatId) {
chatId = chatId == null ? UUID.randomUUID() : chatId;
String message = chatBot.chat(chatId, question);
return new Answer(message, chatId);
}
}
API 接收問題和聊天 ID(可選)。如果未提供 ID,我們將建立它。這允許使用者控制是否要繼續現有的聊天或從頭開始建立聊天。然後,它將兩個參數發送到我們的ChatBot
類,該類整合了對話。或者,我們可以實作一個端點來檢索聊天中的所有訊息。
執行下面的命令會將我們的第一個問題發送給我們的聊天機器人。
# Let's ask: Does quarkus support redis?
curl --location --request POST 'http://localhost:8080/chat?q=Does%20quarkus%20support%20redis%3F'
所以我們得到:
{
"message": "Yes, Quarkus supports Redis through the Quarkus Redis client extension...",
"chatId": "d3414b32-454e-4577-af81-8fb7460f13cd"
}
請注意,由於這是我們的第一個問題,因此沒有提供 ID,因此建立了一個新的 ID。現在,我們可以使用這個 id 來追蹤我們的對話歷史記錄。接下來,讓我們測試聊天機器人是否保留我們的歷史記錄作為對話的上下文。
# Replace the id param with the value we got from the last call.
# So we ask: q=What was my last Quarkus question?&id=d3414b32-454e-4577-af81-8fb7460f13cd
curl --location --request POST 'http://localhost:8080/chat?q=What%20was%20my%20last%20Quarkus%20question%3F&id=d3414b32-454e-4577-af81-8fb7460f13cd'
出色的。正如預期的那樣,我們的聊天機器人正確回答了。
{
"message": "Your last Quarkus question was asking whether Quarkus supports Redis.",
"chatId": "d3414b32-454e-4577-af81-8fb7460f13cd"
}
這意味著我們的簡單聊天機器人應用程式只有在創建幾個類別並設定一些屬性後才準備就緒。
4. 結論
使用 Quarkus 和 LangChain4J 簡化了建立基於 Quarkus 的聊天機器人的過程,該聊天機器人與 OpenAI 的語言模型互動並保留對話記憶。 Quarkus 和 LangChain4j 的強大組合使得能夠以最小的開銷開發人工智慧驅動的應用程序,同時仍然提供豐富的功能。
透過這種設置,我們可以透過添加更多特定領域的知識並提高其回答複雜問題的能力來繼續擴展聊天機器人的功能。 Quarkus 和 Langchain4j 仍然為此提供了許多其他工具。
在本文中,我們看到了 Quarkus 和 LangChain4J 的結合為使用 Java 開發人工智慧系統帶來了多大的生產力和效率。此外,我們也介紹了此類應用程式開發中涉及的概念。
與往常一樣,本文中使用的所有程式碼範例都可以在GitHub 上找到。