使用 Camel Quarkus 和 Quarkus LangChain4j 將非結構化資料轉換為結構化數據
1. 概述
處理非結構化內容時,資料擷取是常見的挑戰。我們可以使用大型語言模型來應對這項挑戰。
在本文中,我們將學習如何使用 Apache Camel 建立整合管道。我們將使用 LangChain4j 將 HTTP 端點與 LLM 集成,並使用 Quarkus 作為框架來一起運行所有元件。
我們還將回顧如何建立使用 LLM 作為建置資料的元件之一的整合路徑。
2. 組件介紹
讓我們回顧一下將幫助我們處理整合管道的每個組件。
2.1.誇庫斯
Quarkus 是一個 Kubernetes 原生 Java 框架,針對建置和部署雲端原生應用程式進行了最佳化。我們可以用它來開發高效能、輕量級的應用程序,這些應用程式啟動速度快並且消耗最少的記憶體。我們將使用 Quarkus 作為運行整合應用程式的框架。
2.2.浪鏈4j
LangChain4j 是一個 Java 程式庫,旨在處理應用程式中的大型語言模型。我們將使用它向法學碩士發送提示以建立內容。此外,LangChain4j 與 Quarkus 有著很好的整合。
2.3.開放人工智慧
OpenAI是一家專注於創造和推進人工智慧技術的人工智慧研發公司。我們可以使用 OpenAI 的模型(例如 GPT)來執行語言生成、資料分析和對話式 AI 等任務。我們將使用它從非結構化內容中提取資料。
2.4.阿帕契駱駝
Apache Camel 是一個整合框架,可以簡化不同系統和應用程式的連接。我們可以使用它透過定義跨不同端點移動和轉換資料的路線來建立複雜的工作流程。
3. HTTP 來源與同步回應的集成
讓我們建立一個整合應用程序,該應用程式將處理具有非結構化內容的 HTTP 呼叫、提取資料並返回結構化回應。
3.1.依賴關係
我們將從新增依賴項開始。我們新增jsonpath依賴項,它將幫助我們在整合管道中提取 JSON 內容:
<dependency>
 <groupId>org.apache.camel.quarkus</groupId>
 <artifactId>camel-quarkus-jsonpath</artifactId>
 <version>${camel-quarkus.version}</version>
 </dependency>接下來,我們加入camel-quarkus-langchain4j依賴項以支援路由中的LangChain4j處理程序:
<dependency>
 <groupId>org.apache.camel.quarkus</groupId>
 <artifactId>camel-quarkus-langchain4j</artifactId>
 <version>${quarkus-camel-langchain4j.version}</version>
 </dependency>
最後,我們新增camel-quarkus-platform-http依賴項以支援HTTP端點作為路由的資料輸入:
<dependency>
 <groupId>org.apache.camel.quarkus</groupId>
 <artifactId>camel-quarkus-platform-http</artifactId>
 <version>${camel-quarkus.version}</version>
 </dependency>3.2.結構化服務
現在,讓我們建立一個StructurizingService ,在其中加入提示邏輯:
@RegisterAiService
 @ApplicationScoped
 public interface StructurizingService {
 String EXTRACT_PROMPT = """
 Extract information about a patient from the text delimited by triple backticks: ```{text}```.
 The customerBirthday field should be formatted as {dateFormat}.
 The summary field should concisely relate the patient visit reason.
 The expected fields are: patientName, patientBirthday, visitReason, allergies, medications.
 Return only a data structure without format name.
 """;
 @UserMessage(EXTRACT_PROMPT)
 @Handler
 String structurize(@JsonPath("$.content") String text, @Header("expectedDateFormat") String dateFormat);
 }我們新增了structurize()方法來建立聊天模型請求。我們使用EXTRACT_PROMPT文字作為提示的範本。我們將從輸入參數中提取非結構化文字並將其添加到聊天訊息中。此外,我們將從第二個方法參數中取得日期格式。我們將該方法標記為 Apache Camel Route @Handler因此我們可以在路由建構器中使用它,而無需指定方法名稱。
3.3.路線產生器
我們使用路由來指定我們的整合管道。我們可以使用 XML 配置或具有RouteBuilder的 Java DSL 來建立路由。
讓我們使用RouteBuilder來配置我們的管道:
@ApplicationScoped
 public class Routes extends RouteBuilder {
 @Inject
 StructurizingService structurizingService;
 @Override
 public void configure() {
 from("platform-http:/structurize?produces=application/json")
 .log("A document has been received by the camel-quarkus-http extension: ${body}")
 .setHeader("expectedDateFormat", constant("YYYY-MM-DD"))
 .bean(structurizingService)
 .transform()
 .body();
 }
 }在我們的路由配置中,我們新增了 HTTP 端點作為資料來源。我們建立了一個具有日期格式的預先配置標頭,並附加了StructurizingService bean 來處理請求,將輸出正文轉換為路由回應。
3.4.測試路線
現在,讓我們呼叫新端點並檢查它如何處理非結構化資料:
@QuarkusTest
 class CamelStructurizeAPIResourceLiveTest {
 Logger logger = LoggerFactory.getLogger(CamelStructurizeAPIResourceLiveTest.class);
 String questionnaireResponses = """
 Operator: Could you provide your name?
 Patient: Hello, My name is Sara Connor.
 //The rest of the conversation...
 """;
 @Test
 void givenHttpRouteWithStructurizingService_whenSendUnstructuredDialog_thenExpectedStructuredDataIsPresent() throws JsonProcessingException {
 ObjectWriter writer = new ObjectMapper().writer();
 String requestBody = writer.writeValueAsString(Map.of("content", questionnaireResponses));
 Response response = RestAssured.given()
 .when()
 .contentType(ContentType.JSON)
 .body(requestBody)
 .post("/structurize");
 logger.info(response.prettyPrint());
 response
 .then()
 .statusCode(200)
 .body("patientName", containsString("Sara Connor"))
 .body("patientBirthday", containsString("1986-07-10"))
 .body("visitReason", containsString("Declaring an accident on main vehicle"));
 }
 }我們稱之為structurize端點。然後,我們發送了患者和醫療服務業者之間的對話。在回應中,我們獲得了結構化資料並驗證了我們是否在預期欄位中擁有有關患者的資訊。
此外,我們已經記錄了整個響應,所以讓我們看一下輸出:
{
 "patientName": "Sara Connor",
 "patientBirthday": "1986-07-10",
 "visitReason": "Declaring an accident on main vehicle",
 "allergies": "Allergic to penicillin; mild reactions to certain over-the-counter antihistamines",
 "medications": "Lisinopril 10 mg, multivitamin, Vitamin D occasionally"
 }正如我們所看到的,所有內容都是結構化的並以 JSON 格式返回。
4. 結論
在本文中,我們討論如何使用 Quarkus、Apache Camel 和 LangChain4j 來建構內容。借助 Apache Camel,我們可以存取各種資料來源,從而為我們的內容創建轉換管道。使用 LangChain4j,我們可以實現資料結構化流程並將其整合到我們的管道中。
與往常一樣,程式碼可以在 GitHub 上取得。