博客 / 詳情

返回

Agent設計模式學習(基於langchain4j實現)(4) - 並行工作流

書接上回,現在簡歷已經潤色得足夠好了,投遞到了HR手上,假設跟候選人也做了初步的電話溝通。接下來,公司需要對候選人做如下審查:

  • 經理:針對簡歷,結合招聘崗位要求,審查簡歷是否符合要求(包括優點和不足)
  • HR:針對簡歷,結合電話溝通記錄以及HR招聘相關要求,審查簡歷是否適合(包括優點和不足)
  • 團隊成員:針對簡歷,評估候選人融入團隊的程度(包括優點和不足)

可以發現,這3個角色對候選人的評估,相互之間並無嚴格的順序依賴,可以並行處理,這就是今天要説的“並行工作流”,示意圖如下:

image

 一、輸入素材

1.1 人事招聘要求 hr_requirements.txt

 1 ## HR招聘要求
 2 - 姓名和聯繫方式必須清晰完整。
 3 - 必須在比利時/歐盟有合法工作許可。
 4 - 最好能在1-2個月內入職。
 5 - 薪資期望在55,000-70,000歐元/年範圍內。
 6 - 穩定的工作歷史;無超過6個月的職業空白期。
 7 - 每個職位至少任職1年,且具有相關科技行業經驗。
 8 - 職業生涯中職責範圍的增長是可取的。
 9 - 要求荷蘭語(母語水平)和英語(C1等級)流利。
10 - 簡歷需清晰、專業;無重大語法問題。
11 - 具備團隊合作、指導他人和產品導向經驗者優先。

1.2 電話面試記錄 phone_interview_notes.txt

 1 電話面試記錄 – 約翰·多伊 (後端工程師) – 2025-09-05
 2 面試官:薩拉·雅各布斯 (HR)
 3 
 4 工作許可: 比利時公民;擁有歐盟工作許可。
 5 工作地點: 安特衞普;傾向每週3天遠程辦公。
 6 可入職時間: 需提前3個月通知;無需搬遷。
 7 薪資期望: 當前年薪62,000歐元;期望約75,000歐元;要求培訓預算。
 8 工作經驗: 約4年後端開發(Java, Spring Boot, PostgreSQL);領導過定價工具項目;使用過Kafka POC;對指導他人有興趣。
 9 職業履歷: 當前職位4年,先前職位1.5年;無重大職業空白期。
10 軟技能: 荷蘭語母語,英語C1水平;溝通清晰;務實,產品導向。
11 備註: 薪資略高於範圍;可入職時間晚於預期;分佈式系統經驗有限。

1.3 優化後的簡歷 tailored_cv.txt

 1 約翰·多伊 – 後端工程師
 2 安特衞普,比利時 | john.doe.dev@protonmail.com | +32 495 67 89 23 | 領英 | GitHub
 3 
 4 簡介
 5 擁有4年以上經驗的後端工程師(Java, Spring Boot, PostgreSQL),專注於可擴展系統、API現代化和自動化。荷蘭語流利,英語C1水平。
 6 
 7 工作經歷
 8 BrightPay Systems(2021年至今):構建後端服務;開發定價工具(報價時間縮短35%);完成SOAP到REST的API遷移;指導實習生。
 9 CodeWave Solutions(2019–2021年):後端開發;建立CI/CD流程(GitHub Actions);使用Docker、Kafka(概念驗證);開發小型React管理界面;參與個人項目(Spring+Vue預算應用,物聯網自動化)。
10 
11 教育背景
12 Java 編程訓練營,BeCode(2019–2020年)
13 機械工程學士,魯汶大學(2016年)
14 
15 技能
16 技術:Java,Spring Boot,PostgreSQL,Docker,Kafka(基礎),CI/CD,REST設計,整潔代碼,指導新人
17 語言:荷蘭語(母語),英語(C1),法語(B1)

二、定義各種審查Agent

2.1 HrCvReviewer 

 1 public interface HrCvReviewer {
 2 
 3     @Agent(name = "hrReviewer", description = "審查簡歷以評估候選人是否符合HR要求,提供反饋和評分")
 4     @SystemMessage("""
 5             你作為HR專員,根據以下職位要求審查簡歷:
 6             {{hrRequirements}}
 7             你需要為每份簡歷提供評分和反饋(包括優點和不足之處)。
 8             可以忽略諸如缺少地址或佔位符等內容。
 9             
10             重要提示:請僅返回有效的JSON格式響應,換行符使用\\n,不要包含任何Markdown格式或代碼塊。
11             """)
12     @UserMessage("""
13             請審查這份簡歷:{{candidateCv}},以及附帶的電話面試記錄:{{phoneInterviewNotes}}
14             """)
15     CvReview reviewCv(@V("candidateCv") String cv, @V("phoneInterviewNotes") String phoneInterviewNotes, @V("hrRequirements") String hrRequirements);
16 }

2.2 ManagerCvReviewer

 1 public interface ManagerCvReviewer {
 2 
 3     @Agent(name = "managerReviewer", description = "基於職位描述審查簡歷,提供反饋和評分")
 4     @SystemMessage("""
 5             你是該職位的招聘經理:
 6             {{jobDescription}}
 7             你需要審查申請人簡歷,從眾多候選人中決定邀請誰參加現場面試。
 8             你需要為每份簡歷提供評分和反饋(包括優點和不足之處)。
 9             可以忽略諸如缺少地址或佔位符等內容。
10             
11             重要提示:請僅返回有效的JSON格式響應,換行符使用\\n,不要包含任何Markdown格式或代碼塊。
12             """)
13     @UserMessage("""
14             請審查這份簡歷:{{candidateCv}}
15             """)
16     CvReview reviewCv(@V("candidateCv") String cv, @V("jobDescription") String jobDescription);
17 }

2.3 TeamMemberCvReviewer 

 1 public interface TeamMemberCvReviewer {
 2 
 3     @Agent(name = "teamMemberReviewer", description = "審查簡歷以評估候選人是否適合團隊,提供反饋和評分")
 4     @SystemMessage("""
 5             你在一個充滿動力、自我驅動的同事且擁有高度自由度的團隊中工作。
 6             你的團隊重視協作、責任感和務實精神。
 7             你需要審查申請人簡歷,評估此人融入團隊的程度。
 8             你需要為每份簡歷提供評分和反饋(包括優點和不足之處)。
 9             可以忽略諸如缺少地址或佔位符等內容。
10             
11             重要提示:請僅返回有效的JSON格式響應,換行符使用\\n,不要包含任何Markdown格式或代碼塊。
12             """)
13     @UserMessage("""
14             請審查這份簡歷:{{candidateCv}}
15             """)
16     CvReview reviewCv(@V("candidateCv") String cv);
17 }

 三、並行Agent示例

 1 /**
 2  * 這個示例演示瞭如何實現3個並行的CvReviewer智能體,
 3  * 它們將同時評估簡歷。我們將實現三個智能體:
 4  * - ManagerCvReviewer(評估候選人勝任工作的可能性)
 5  *      輸入:簡歷和職位描述
 6  * - TeamMemberCvReviewer(評估候選人融入團隊的程度)
 7  *      輸入:簡歷
 8  * - HrCvReviewer(從HR角度檢查候選人是否符合要求)
 9  *      輸入:簡歷、HR要求
10  * by 菩提樹下的楊過(yjmyzz.cnblogs.com)
11  */
12 @SpringBootApplication
13 public class _4_Parallel_Workflow_Example {
14 
15     public static void main(String[] args) throws IOException {
16         ConfigurableApplicationContext context = SpringApplication.run(AgentDesignPatternApplication.class, args);
17         ChatModel model = context.getBean("ollamaChatModel", ChatModel.class);
18 
19         // 2. 在本包中定義三個子智能體:
20         //      - HrCvReviewer.java
21         //      - ManagerCvReviewer.java
22         //      - TeamMemberCvReviewer.java
23 
24         // 3. 使用AgenticServices創建所有智能體
25         HrCvReviewer hrCvReviewer = AgenticServices.agentBuilder(HrCvReviewer.class)
26                 .chatModel(model)
27                 .outputKey("hrReview") // 這將在每次迭代中被覆蓋,同時也作為我們想要觀察的最終輸出
28                 .build();
29 
30         ManagerCvReviewer managerCvReviewer = AgenticServices.agentBuilder(ManagerCvReviewer.class)
31                 .chatModel(model)
32                 .outputKey("managerReview") // 這會覆蓋原始輸入指令,並在每次迭代中被覆蓋,用作CvTailor的新指令
33                 .build();
34 
35         TeamMemberCvReviewer teamMemberCvReviewer = AgenticServices.agentBuilder(TeamMemberCvReviewer.class)
36                 .chatModel(model)
37                 .outputKey("teamMemberReview") // 這會覆蓋原始輸入指令,並在每次迭代中被覆蓋,用作CvTailor的新指令
38                 .build();
39 
40         // 4. 構建執行流程
41         var executor = Executors.newFixedThreadPool(3);  // 保留引用以便後續關閉
42 
43         UntypedAgent cvReviewGenerator = AgenticServices // 使用UntypedAgent,除非你定義了結果組合智能體,參見_2_Sequential_Agent_Example
44                 .parallelBuilder()
45                 .subAgents(hrCvReviewer, managerCvReviewer, teamMemberCvReviewer) // 可以添加任意多個
46                 .executor(executor) // 可選,默認使用內部緩存的線程池,執行完成後會自動關閉
47                 .outputKey("fullCvReview") // 這是我們想要觀察的最終輸出
48                 .output(agenticScope -> {
49                     // 從智能體作用域讀取每個評審者的輸出
50                     CvReview hrReview = (CvReview) agenticScope.readState("hrReview");
51                     CvReview managerReview = (CvReview) agenticScope.readState("managerReview");
52                     CvReview teamMemberReview = (CvReview) agenticScope.readState("teamMemberReview");
53                     // 返回彙總的評審結果,包含平均分(或你想要的任何其他聚合方式)
54                     String feedback = String.join("\n",
55                             "HR評審: " + hrReview.feedback,
56                             "經理評審: " + managerReview.feedback,
57                             "團隊成員評審: " + teamMemberReview.feedback
58                     );
59                     double avgScore = (hrReview.score + managerReview.score + teamMemberReview.score) / 3.0;
60 
61                     return new CvReview(avgScore, feedback);
62                 })
63                 .build();
64 
65         // 5. 從resources/documents/目錄下的文本文件加載原始參數
66         String candidateCv = StringLoader.loadFromResource("/documents/tailored_cv.txt");
67         String jobDescription = StringLoader.loadFromResource("/documents/job_description_backend.txt");
68         String hrRequirements = StringLoader.loadFromResource("/documents/hr_requirements.txt");
69         String phoneInterviewNotes = StringLoader.loadFromResource("/documents/phone_interview_notes.txt");
70 
71         // 6. 由於我們使用了無類型智能體,需要傳遞參數映射
72         Map<String, Object> arguments = Map.of(
73                 "candidateCv", candidateCv,
74                 "jobDescription", jobDescription
75                 , "hrRequirements", hrRequirements
76                 , "phoneInterviewNotes", phoneInterviewNotes
77         );
78 
79         // 7. 調用組合智能體生成定製的簡歷
80         var review = cvReviewGenerator.invoke(arguments);
81 
82         // 8. 打印生成的簡歷
83         System.out.println("=== 已評審的簡歷 ===");
84         System.out.println(review);
85 
86         // 9. 關閉執行器
87         executor.shutdown();
88 
89     }
90 
91 
92 }

時序圖(簡化版) - AI生成

04_sequence_diagram_simple

時序圖(詳細版) - AI生成

04_sequence_diagram_detail

 運行結果:

 1 2026-01-17T15:54:11.422+08:00  INFO 9072 --- [langchain4j-study] [pool-5-thread-3] d.l.http.client.log.LoggingHttpClient    : HTTP request:
 2 - method: POST
 3 - url: http://localhost:11434/api/chat
 4 - headers: [Content-Type: application/json]
 5 - body: {
 6   "model" : "deepseek-v3.1:671b-cloud",
 7   "messages" : [ {
 8     "role" : "system",
 9     "content" : "你在一個充滿動力、自我驅動的同事且擁有高度自由度的團隊中工作。\n你的團隊重視協作、責任感和務實精神。\n你需要審查申請人簡歷,評估此人融入團隊的程度。\n你需要為每份簡歷提供評分和反饋(包括優點和不足之處)。\n可以忽略諸如缺少地址或佔位符等內容。\n\n重要提示:請僅返回有效的JSON格式響應,換行符使用\\n,不要包含任何Markdown格式或代碼塊。\n"
10   }, {
11     "role" : "user",
12     "content" : "請審查這份簡歷:約翰·多伊 – 後端工程師\r\n安特衞普,比利時 | john.doe.dev@protonmail.com | +32 495 67 89 23 | 領英 | GitHub\r\n\r\n簡介\r\n擁有4年以上經驗的後端工程師(Java, Spring Boot, PostgreSQL),專注於可擴展系統、API現代化和自動化。荷蘭語流利,英語C1水平。\r\n\r\n工作經歷\r\nBrightPay Systems(2021年至今):構建後端服務;開發定價工具(報價時間縮短35%);完成SOAP到REST的API遷移;指導實習生。\r\nCodeWave Solutions(2019–2021年):後端開發;建立CI/CD流程(GitHub Actions);使用Docker、Kafka(概念驗證);開發小型React管理界面;參與個人項目(Spring+Vue預算應用,物聯網自動化)。\r\n\r\n教育背景\r\nJava 編程訓練營,BeCode(2019–2020年)\r\n機械工程學士,魯汶大學(2016年)\r\n\r\n技能\r\n技術:Java,Spring Boot,PostgreSQL,Docker,Kafka(基礎),CI/CD,REST設計,整潔代碼,指導新人\r\n語言:荷蘭語(母語),英語(C1),法語(B1)\n\nYou must answer strictly in the following JSON format: {\n\"score\": (從0到1分你邀請這位應聘者參加面試的可能性; type: double),\n\"feedback\": (對簡歷的反饋,什麼是好的,什麼需要改進,什麼技能缺失,什麼危險信號……; type: string)\n}"
13   } ],
14   "options" : {
15     "stop" : [ ]
16   },
17   "stream" : false,
18   "tools" : [ ]
19 }
20 
21 2026-01-17T15:54:11.422+08:00  INFO 9072 --- [langchain4j-study] [pool-5-thread-2] d.l.http.client.log.LoggingHttpClient    : HTTP request:
22 - method: POST
23 - url: http://localhost:11434/api/chat
24 - headers: [Content-Type: application/json]
25 - body: {
26   "model" : "deepseek-v3.1:671b-cloud",
27   "messages" : [ {
28     "role" : "system",
29     "content" : "你是該職位的招聘經理:\n職位描述 ID: 123A\r\n後端工程師(金融科技,安特衞普)\r\n------------------------------------------------------------\r\n我們正在招聘一位**後端工程師**,協助我們構建並完善支付與對賬服務。您將主要使用 **Java (Spring Boot)**,並與產品及運營團隊緊密合作,確保金融交易系統的可靠性和可擴展性。\r\n\r\n**職責:**\r\n*   設計、實現並維護能夠處理大規模支付與對賬業務的後端服務。\r\n*   在雲原生環境中使用 **PostgreSQL**、**Kafka**、**Docker** 和 **Kubernetes**。\r\n*   專注於構建可靠、冪等的系統,並具備強大的可觀測性。\r\n*   支持將遺留服務遷移至現代的 REST API。\r\n\r\n**要求:**\r\n*   具備 Java 和 Spring Boot 後端開發的職業經驗。\r\n*   深入理解關係型數據庫和事件驅動架構。\r\n*   熟悉容器化技術和部署流程。\r\n*   有金融或定價系統相關經驗者優先。\r\n*   要求英語流利,會荷蘭語者更佳。\n你需要審查申請人簡歷,從眾多候選人中決定邀請誰參加現場面試。\n你需要為每份簡歷提供評分和反饋(包括優點和不足之處)。\n可以忽略諸如缺少地址或佔位符等內容。\n\n重要提示:請僅返回有效的JSON格式響應,換行符使用\\n,不要包含任何Markdown格式或代碼塊。\n"
30   }, {
31     "role" : "user",
32     "content" : "請審查這份簡歷:約翰·多伊 – 後端工程師\r\n安特衞普,比利時 | john.doe.dev@protonmail.com | +32 495 67 89 23 | 領英 | GitHub\r\n\r\n簡介\r\n擁有4年以上經驗的後端工程師(Java, Spring Boot, PostgreSQL),專注於可擴展系統、API現代化和自動化。荷蘭語流利,英語C1水平。\r\n\r\n工作經歷\r\nBrightPay Systems(2021年至今):構建後端服務;開發定價工具(報價時間縮短35%);完成SOAP到REST的API遷移;指導實習生。\r\nCodeWave Solutions(2019–2021年):後端開發;建立CI/CD流程(GitHub Actions);使用Docker、Kafka(概念驗證);開發小型React管理界面;參與個人項目(Spring+Vue預算應用,物聯網自動化)。\r\n\r\n教育背景\r\nJava 編程訓練營,BeCode(2019–2020年)\r\n機械工程學士,魯汶大學(2016年)\r\n\r\n技能\r\n技術:Java,Spring Boot,PostgreSQL,Docker,Kafka(基礎),CI/CD,REST設計,整潔代碼,指導新人\r\n語言:荷蘭語(母語),英語(C1),法語(B1)\n\nYou must answer strictly in the following JSON format: {\n\"score\": (從0到1分你邀請這位應聘者參加面試的可能性; type: double),\n\"feedback\": (對簡歷的反饋,什麼是好的,什麼需要改進,什麼技能缺失,什麼危險信號……; type: string)\n}"
33   } ],
34   "options" : {
35     "stop" : [ ]
36   },
37   "stream" : false,
38   "tools" : [ ]
39 }
40 
41 2026-01-17T15:54:11.422+08:00  INFO 9072 --- [langchain4j-study] [pool-5-thread-1] d.l.http.client.log.LoggingHttpClient    : HTTP request:
42 - method: POST
43 - url: http://localhost:11434/api/chat
44 - headers: [Content-Type: application/json]
45 - body: {
46   "model" : "deepseek-v3.1:671b-cloud",
47   "messages" : [ {
48     "role" : "system",
49     "content" : "你作為HR專員,根據以下職位要求審查簡歷:\n## HR招聘要求\r\n- 姓名和聯繫方式必須清晰完整。\r\n- 必須在比利時/歐盟有合法工作許可。\r\n- 最好能在1-2個月內入職。\r\n- 薪資期望在55,000-70,000歐元/年範圍內。\r\n- 穩定的工作歷史;無超過6個月的職業空白期。\r\n- 每個職位至少任職1年,且具有相關科技行業經驗。\r\n- 職業生涯中職責範圍的增長是可取的。\r\n- 要求荷蘭語(母語水平)和英語(C1等級)流利。\r\n- 簡歷需清晰、專業;無重大語法問題。\r\n- 具備團隊合作、指導他人和產品導向經驗者優先。\n你需要為每份簡歷提供評分和反饋(包括優點和不足之處)。\n可以忽略諸如缺少地址或佔位符等內容。\n\n重要提示:請僅返回有效的JSON格式響應,換行符使用\\n,不要包含任何Markdown格式或代碼塊。\n"
50   }, {
51     "role" : "user",
52     "content" : "請審查這份簡歷:約翰·多伊 – 後端工程師\r\n安特衞普,比利時 | john.doe.dev@protonmail.com | +32 495 67 89 23 | 領英 | GitHub\r\n\r\n簡介\r\n擁有4年以上經驗的後端工程師(Java, Spring Boot, PostgreSQL),專注於可擴展系統、API現代化和自動化。荷蘭語流利,英語C1水平。\r\n\r\n工作經歷\r\nBrightPay Systems(2021年至今):構建後端服務;開發定價工具(報價時間縮短35%);完成SOAP到REST的API遷移;指導實習生。\r\nCodeWave Solutions(2019–2021年):後端開發;建立CI/CD流程(GitHub Actions);使用Docker、Kafka(概念驗證);開發小型React管理界面;參與個人項目(Spring+Vue預算應用,物聯網自動化)。\r\n\r\n教育背景\r\nJava 編程訓練營,BeCode(2019–2020年)\r\n機械工程學士,魯汶大學(2016年)\r\n\r\n技能\r\n技術:Java,Spring Boot,PostgreSQL,Docker,Kafka(基礎),CI/CD,REST設計,整潔代碼,指導新人\r\n語言:荷蘭語(母語),英語(C1),法語(B1),以及附帶的電話面試記錄:電話面試記錄 – 約翰·多伊 (後端工程師) – 2025-09-05\r\n面試官:薩拉·雅各布斯 (HR)\r\n\r\n工作許可: 比利時公民;擁有歐盟工作許可。\r\n工作地點: 安特衞普;傾向每週3天遠程辦公。\r\n可入職時間: 需提前3個月通知;無需搬遷。\r\n薪資期望: 當前年薪62,000歐元;期望約75,000歐元;要求培訓預算。\r\n工作經驗: 約4年後端開發(Java, Spring Boot, PostgreSQL);領導過定價工具項目;使用過Kafka POC;對指導他人有興趣。\r\n職業履歷: 當前職位4年,先前職位1.5年;無重大職業空白期。\r\n軟技能: 荷蘭語母語,英語C1水平;溝通清晰;務實,產品導向。\r\n備註: 薪資略高於範圍;可入職時間晚於預期;分佈式系統經驗有限。\n\nYou must answer strictly in the following JSON format: {\n\"score\": (從0到1分你邀請這位應聘者參加面試的可能性; type: double),\n\"feedback\": (對簡歷的反饋,什麼是好的,什麼需要改進,什麼技能缺失,什麼危險信號……; type: string)\n}"
53   } ],
54   "options" : {
55     "stop" : [ ]
56   },
57   "stream" : false,
58   "tools" : [ ]
59 }
60 
61 2026-01-17T15:54:14.452+08:00  INFO 9072 --- [langchain4j-study] [pool-5-thread-2] d.l.http.client.log.LoggingHttpClient    : HTTP response:
62 - status code: 200
63 - headers: [content-type: application/json; charset=utf-8], [date: Sat, 17 Jan 2026 07:54:14 GMT], [transfer-encoding: chunked]
64 - body: {"model":"deepseek-v3.1:671b-cloud","remote_model":"deepseek-v3.1:671b","remote_host":"https://ollama.com:443","created_at":"2026-01-17T07:54:14.128982804Z","message":{"role":"assistant","content":"{\n\"score\": 0.7,\n\"feedback\": \"優點:擁有4年相關的Java和Spring Boot經驗,具體參與了API現代化工作(SOAP到REST),符合職位需求。有定價工具開發經驗,這是優先考慮項。技術棧(PostgreSQL, Docker)與職位匹配。荷蘭語流利,英語溝通能力良好。有指導經驗。\\n不足之處:金融科技或支付系統直接經驗未明確提及,這是一個關鍵需求。Kafka經驗標註為“基礎”和“概念驗證”,可能不夠深入。金融系統所需的可靠性和可觀測性技能在簡歷中未突出。缺乏Kubernetes經驗的明確説明。教育背景中機械工程學位與軟件工程關聯性較弱。\"\n}"},"done":true,"done_reason":"stop","total_duration":2523983598,"prompt_eval_count":674,"eval_count":153}
65 
66 
67 2026-01-17T15:55:22.847+08:00  INFO 9072 --- [langchain4j-study] [pool-5-thread-3] d.l.http.client.log.LoggingHttpClient    : HTTP response:
68 - status code: 200
69 - headers: [content-type: application/json; charset=utf-8], [date: Sat, 17 Jan 2026 07:55:22 GMT], [transfer-encoding: chunked]
70 - body: {"model":"deepseek-v3.1:671b-cloud","remote_model":"deepseek-v3.1:671b","remote_host":"https://ollama.com:443","created_at":"2026-01-17T07:55:22.545191436Z","message":{"role":"assistant","content":"{\n\"score\": 0.75,\n\"feedback\": \"好的方面:具備4年相關經驗,技術棧與職位需求匹配(Java, Spring Boot, PostgreSQL),有實際項目成果(如SOAP到REST遷移、CI/CD實施),顯示了自動化和可擴展系統的關注點;擁有指導經驗,符合團隊協作價值觀。需要改進:個人項目和技術廣度(如Kafka基礎、React經驗)可能不太深入,缺乏對系統設計或大規模處理的具體細節;教育背景中機械工程與軟件工程無關,但訓練營彌補了部分。技能缺失:缺乏雲平台(AWS/Azure)或微服務架構經驗,可能限制在高度分佈式團隊中的貢獻。無明顯危險信號。\"\n}"},"done":true,"done_reason":"stop","total_duration":10361972956,"prompt_eval_count":442,"eval_count":151}
71 
72 
73 2026-01-17T15:55:26.421+08:00  INFO 9072 --- [langchain4j-study] [pool-5-thread-1] d.l.http.client.log.LoggingHttpClient    : HTTP response:
74 - status code: 200
75 - headers: [content-type: application/json; charset=utf-8], [date: Sat, 17 Jan 2026 07:55:26 GMT], [transfer-encoding: chunked]
76 - body: {"model":"deepseek-v3.1:671b-cloud","remote_model":"deepseek-v3.1:671b","remote_host":"https://ollama.com:443","created_at":"2026-01-17T07:55:26.117462176Z","message":{"role":"assistant","content":"{\n\"score\": 0.7,\n\"feedback\": \"簡歷優點:姓名、聯繫方式和比利時/歐盟工作許可明確;每個職位任職時間超過1年(分別是4年和1.5年),無重大職業空白期,工作歷史穩定;荷蘭語和英語水平符合要求(荷蘭語母語,英語C1);技能與職位要求匹配,具有Java、Spring Boot等後端開發經驗;展示了職責範圍增長(如指導實習生、領導定價工具項目)。不足之處:薪資期望(75,000歐元)略高於職位範圍(55,000-70,000歐元);可入職時間(需3個月通知)晚於理想的1-2個月;分佈式系統經驗(如Kafka)有限且為概念驗證;簡歷過於簡潔,缺乏細節,如工作職責描述可以更具體和專業。\"\n}"},"done":true,"done_reason":"stop","total_duration":13998598290,"prompt_eval_count":798,"eval_count":174}
77 
78 
79 === 已評審的簡歷 ===
80 
81 CvReview:  - score = 0.7166666666666667
82 - feedback = "HR評審: 簡歷優點:姓名、聯繫方式和比利時/歐盟工作許可明確;每個職位任職時間超過1年(分別是4年和1.5年),無重大職業空白期,工作歷史穩定;荷蘭語和英語水平符合要求(荷蘭語母語,英語C1);技能與職位要求匹配,具有Java、Spring Boot等後端開發經驗;展示了職責範圍增長(如指導實習生、領導定價工具項目)。不足之處:薪資期望(75,000歐元)略高於職位範圍(55,000-70,000歐元);可入職時間(需3個月通知)晚於理想的1-2個月;分佈式系統經驗(如Kafka)有限且為概念驗證;簡歷過於簡潔,缺乏細節,如工作職責描述可以更具體和專業。
83 經理評審: 優點:擁有4年相關的Java和Spring Boot經驗,具體參與了API現代化工作(SOAP到REST),符合職位需求。有定價工具開發經驗,這是優先考慮項。技術棧(PostgreSQL, Docker)與職位匹配。荷蘭語流利,英語溝通能力良好。有指導經驗。
84 不足之處:金融科技或支付系統直接經驗未明確提及,這是一個關鍵需求。Kafka經驗標註為“基礎”和“概念驗證”,可能不夠深入。金融系統所需的可靠性和可觀測性技能在簡歷中未突出。缺乏Kubernetes經驗的明確説明。教育背景中機械工程學位與軟件工程關聯性較弱。
85 團隊成員評審: 好的方面:具備4年相關經驗,技術棧與職位需求匹配(Java, Spring Boot, PostgreSQL),有實際項目成果(如SOAP到REST遷移、CI/CD實施),顯示了自動化和可擴展系統的關注點;擁有指導經驗,符合團隊協作價值觀。需要改進:個人項目和技術廣度(如Kafka基礎、React經驗)可能不太深入,缺乏對系統設計或大規模處理的具體細節;教育背景中機械工程與軟件工程無關,但訓練營彌補了部分。技能缺失:缺乏雲平台(AWS/Azure)或微服務架構經驗,可能限制在高度分佈式團隊中的貢獻。無明顯危險信號。"

82行,即為3個評審Agent並行執行的結果。

 

文中示例代碼:

https://github.com/yjmyzz/agentic_turoial_with_langchain4j

 

參考:

Building Effective AI Agents \ Anthropic

[譯] AI Workflow & AI Agent:架構、模式與工程建議(Anthropic,2024)

Agents and Agentic AI | LangChain4j

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.