บทเรียน Foundry Local Spring Boot
April 15, 2026 · View on GitHub
สารบัญ
- ข้อกำหนดเบื้องต้น
- ภาพรวมโครงการ
- ทำความเข้าใจกับโค้ด
- ภาพรวมการทำงานทั้งหมด
- การตั้งค่า Foundry Local
- การรันแอปพลิเคชัน
- ผลลัพธ์ที่คาดหวัง
- ขั้นตอนถัดไป
- การแก้ไขปัญหา
ข้อกำหนดเบื้องต้น
ก่อนเริ่มบทเรียนนี้ โปรดตรวจสอบให้แน่ใจว่าคุณมี:
- ติดตั้ง Java 21 ขึ้นไป บนระบบของคุณ
- มี Maven 3.6+ สำหรับการสร้างโครงการ
- ติดตั้งและรัน Foundry Local
การติดตั้ง Foundry Local:
หมายเหตุ: Foundry Local CLI ใช้งานได้เฉพาะบน Windows และ macOS เท่านั้น สำหรับ Linux รองรับผ่าน Foundry Local SDKs (Python, JavaScript, C#, Rust)
# วินโดวส์
winget install Microsoft.FoundryLocal
# แมคโอเอส
brew tap microsoft/foundrylocal
brew install foundrylocal
ตรวจสอบการติดตั้ง:
foundry --version
ภาพรวมโครงการ
โครงการนี้ประกอบด้วยส่วนประกอบหลักสี่ส่วน:
- Application.java - จุดเริ่มต้นของแอป Spring Boot หลัก
- FoundryLocalService.java - ชั้นบริการที่จัดการการสื่อสารกับ AI
- application.properties - การกำหนดค่าสำหรับการเชื่อมต่อ Foundry Local
- pom.xml - การพึ่งพา Maven และการตั้งค่าโปรเจกต์
ทำความเข้าใจกับโค้ด
1. การกำหนดค่าของแอปพลิเคชัน (application.properties)
ไฟล์: src/main/resources/application.properties
foundry.local.base-url=http://localhost:5273/v1
# foundry.local.model is auto-detected from Foundry Local. Set it here to override:
# foundry.local.model=Phi-4-mini-instruct-cuda-gpu:5
สิ่งที่ทำ:
- base-url: ระบุที่อยู่ที่ Foundry Local กำลังรันอยู่ รวมทั้งเส้นทาง
/v1เพื่อความสอดคล้องกับ OpenAI API พอร์ตเริ่มต้นคือ5273หากพอร์ตแตกต่างกัน ให้ตรวจสอบด้วยfoundry service status - model (ตัวเลือก): ตั้งชื่อโมเดล AI ที่จะใช้สำหรับการสร้างข้อความ โดยปกติแอปจะตรวจสอบโมเดลเองโดยอัตโนมัติ ด้วยการเรียก
/v1/modelsของ Foundry Local ตอนเริ่มแอป คุณจึงไม่จำเป็นต้องตั้งค่าเอง แต่ยังสามารถตั้งค่าชื่อโมเดลแบบชัดเจนเพื่อแทนที่การตรวจจับอัตโนมัติได้ถ้าต้องการ
แนวคิดสำคัญ: Spring Boot จะโหลดการตั้งค่าเหล่านี้โดยอัตโนมัติและทำให้สามารถเข้าถึงค่าต่าง ๆ ในแอปของคุณผ่าน @Value annotation
2. คลาสแอปพลิเคชันหลัก (Application.java)
ไฟล์: src/main/java/com/example/Application.java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
app.setWebApplicationType(WebApplicationType.NONE); // ไม่ต้องใช้เว็บเซิร์ฟเวอร์
app.run(args);
}
สิ่งที่ทำ:
@SpringBootApplicationเปิดใช้งานการตั้งค่าอัตโนมัติของ Spring BootWebApplicationType.NONEบอกว่าแอปนี้เป็นแอป command-line ไม่ใช่เว็บเซิร์ฟเวอร์- เมธอดหลักเริ่มต้น Spring application
โค้ด Demo Runner:
@Bean
public CommandLineRunner foundryLocalRunner(FoundryLocalService foundryLocalService) {
return args -> {
System.out.println("=== Foundry Local Demo ===");
System.out.println("Calling Foundry Local service...");
String testMessage = "Hello! Can you tell me what you are and what model you're running?";
System.out.println("Sending message: " + testMessage);
String response = foundryLocalService.chat(testMessage);
System.out.println("Response from Foundry Local:");
System.out.println(response);
System.out.println("=========================");
};
}
สิ่งที่ทำ:
@Beanสร้างคอมโพเนนต์ที่ Spring จัดการให้CommandLineRunnerรันโค้ดหลังจาก Spring Boot เริ่มทำงานfoundryLocalServiceถูกฉีดเข้ามาโดย Spring (dependency injection)- ส่งข้อความทดสอบไปยัง AI และแสดงผลลัพธ์
3. ชั้นบริการ AI (FoundryLocalService.java)
ไฟล์: src/main/java/com/example/FoundryLocalService.java
การฉีดการตั้งค่า:
@Service
public class FoundryLocalService {
@Value("${foundry.local.base-url:http://localhost:5273/v1}")
private String baseUrl;
@Value("${foundry.local.model:}")
private String model; // ตรวจจับโดยอัตโนมัติหากว่างเปล่า
สิ่งที่ทำ:
@Serviceแจ้งให้ Spring ว่านี่คือคลาสที่ให้บริการธุรกิจ@Valueฉีดค่าการตั้งค่าจากไฟล์ application.properties- โมเดลตั้งค่าเริ่มต้นเป็นค่าว่าง ทำให้เกิดการ ตรวจจับอัตโนมัติ จาก Foundry Local ตอนแอปรัน ซึ่งหมายความว่าแอปสามารถทำงานกับโมเดลใดก็ได้ที่โหลดใน Foundry Local โดยไม่ต้องตั้งค่าเอง
การเริ่มต้นไคลเอ็นต์:
@PostConstruct
public void init() {
// ตรวจจับโมเดลโดยอัตโนมัติจาก Foundry Local หากไม่ได้กำหนดค่าอย่างชัดเจน
if (model == null || model.isBlank()) {
model = detectModel();
}
this.openAIClient = OpenAIOkHttpClient.builder()
.baseUrl(baseUrl) // URL พื้นฐานรวม /v1 จากการกำหนดค่าแล้ว
.apiKey("not-needed") // เซิร์ฟเวอร์ท้องถิ่นไม่จำเป็นต้องใช้คีย์ API จริง
.build();
}
สิ่งที่ทำ:
@PostConstructรันเมธอดนี้หลังจาก Spring สร้างบริการเสร็จ- หากยังไม่มีการตั้งค่าโมเดล จะเรียก
/v1/modelsของ Foundry Local และเลือกโมเดลแรกที่โหลดอยู่ - สร้างไคลเอ็นต์ OpenAI ที่ชี้ไปยัง Foundry Local บนเครื่องของคุณ
- base URL จาก
application.propertiesมี/v1รวมอยู่แล้วสำหรับการใช้งานร่วมกับ OpenAI API - API คีย์ตั้งเป็น "not-needed" เพราะการพัฒนาท้องถิ่นไม่จำเป็นต้องเข้าสู่ระบบ
เมธอด Chat:
public String chat(String message) {
try {
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
.model(model) // ใช้โมเดล AI ตัวไหน
.addUserMessage(message) // คำถาม/ข้อความของคุณ
.maxCompletionTokens(150) // จำกัดความยาวคำตอบ
.temperature(0.7) // ควบคุมความคิดสร้างสรรค์ (0.0-1.0)
.build();
ChatCompletion chatCompletion = openAIClient.chat().completions().create(params);
// ดึงคำตอบของ AI จากผลลัพธ์ของ API
if (chatCompletion.choices() != null && !chatCompletion.choices().isEmpty()) {
return chatCompletion.choices().get(0).message().content().orElse("No response found");
}
return "No response content found";
} catch (Exception e) {
throw new RuntimeException("Error calling chat completion: " + e.getMessage(), e);
}
}
สิ่งที่ทำ:
- ChatCompletionCreateParams: ตั้งค่า request ไปยัง AI
model: ระบุโมเดล AI ที่จะใช้ (ต้องตรงกับ ID จากfoundry model list)addUserMessage: เพิ่มข้อความของผู้ใช้ในการสนทนาmaxCompletionTokens: จำกัดความยาวคำตอบ (ช่วยประหยัดทรัพยากร)temperature: ควบคุมความสุ่ม (0.0 = ตายตัว, 1.0 = สร้างสรรค์)
- เรียก API: ส่ง request ไปที่ Foundry Local
- จัดการผลตอบกลับ: ดึงข้อความตอบกลับจาก AI อย่างปลอดภัย
- จัดการข้อผิดพลาด: ห่อหุ้มข้อยกเว้นด้วยข้อความแสดงความผิดพลาดที่ช่วยให้เข้าใจ
4. การพึ่งพาโครงการ (pom.xml)
การพึ่งพาที่สำคัญ:
<!-- Spring Boot - Application framework -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!-- OpenAI Java SDK - For AI API calls -->
<dependency>
<groupId>com.openai</groupId>
<artifactId>openai-java</artifactId>
<version>2.12.0</version>
</dependency>
<!-- Jackson - JSON processing -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.0</version>
</dependency>
สิ่งที่ทำ:
- spring-boot-starter: ให้ฟังก์ชันหลักของ Spring Boot
- openai-java: SDK อย่างเป็นทางการของ OpenAI สำหรับ Java เพื่อสื่อสารกับ API
- jackson-databind: จัดการการแปลง JSON สำหรับการเรียก API
ภาพรวมการทำงานทั้งหมด
นี่คือขั้นตอนการทำงานเวลาที่คุณรันแอป:
- เริ่มต้น: Spring Boot เริ่มและอ่านค่าใน
application.properties - สร้างบริการ: Spring สร้าง
FoundryLocalServiceและฉีดค่าการตั้งค่าเข้าไป - ตรวจจับโมเดล: หากไม่มีการกำหนดโมเดลไว้ บริการจะเรียก
/v1/modelsของ Foundry Local และใช้โมเดลตัวแรกโดยอัตโนมัติ - ตั้งค่าไคลเอ็นต์:
@PostConstructเริ่มต้นไคลเอ็นต์ OpenAI เพื่อเชื่อมต่อกับ Foundry Local - รัน Demo:
CommandLineRunnerรันหลังจากเริ่มแอป - เรียก AI: โค้ด demo เรียก
foundryLocalService.chat()กับข้อความทดสอบ - ส่ง request API: บริการสร้างและส่งคำขอที่รองรับ OpenAI ไปยัง Foundry Local
- ประมวลผลผลลัพธ์: บริการดึงและส่งคืนข้อความตอบกลับจาก AI
- แสดงผล: แอปพิมพ์คำตอบและออกจากระบบ
การตั้งค่า Foundry Local
-
ติดตั้ง Foundry Local ตามคำแนะนำในส่วน ข้อกำหนดเบื้องต้น
-
เริ่มบริการ (หากยังไม่ได้รัน):
foundry service start -
ตรวจสอบสถานะบริการ เพื่อยืนยันว่าบริการกำลังทำงานและจดพอร์ต:
foundry service status -
ดาวน์โหลดและรันโมเดล (ดาวน์โหลดครั้งแรกที่รัน, แคชสำหรับครั้งถัดไป):
foundry model run phi-4-miniจะเปิดเซสชันแชทอินเทอร์แอกทีฟ คุณสามารถออกได้ด้วย
Ctrl+Cโมเดลยังคงถูกโหลดอยู่ในบริการเคล็ดลับ: รัน
foundry model listเพื่อดูโมเดลทั้งหมดที่มี ใช้ชื่อเล่นแทนphi-4-miniจากแค็ตตาล็อก (เช่นqwen2.5-0.5bสำหรับโมเดลขนาดเล็ก/เร็วกว่า) -
ตรวจสอบว่าโมเดลถูกโหลดแล้ว:
foundry service ps -
อัปเดต
application.propertiesหากจำเป็น:- ค่า
base-urlเริ่มต้น (http://localhost:5273/v1) เหมาะกับพอร์ต CLI เริ่มต้น ปรับเฉพาะถ้าfoundry service statusแสดงพอร์ตต่างออกไป - โมเดลจะถูก ตรวจจับโดยอัตโนมัติ ตอนเริ่มแอป — ไม่ต้องตั้งค่าเอง
foundry.local.base-url=http://localhost:5273/v1 # Model is auto-detected. Uncomment below to override: # foundry.local.model=Phi-4-mini-instruct-cuda-gpu:5 - ค่า
การรันแอปพลิเคชัน
ขั้นตอนที่ 1: ตรวจสอบว่าโมเดลถูกโหลดใน Foundry Local
foundry service ps
ถ้าไม่มีโมเดลใดแสดง, ให้โหลดโมเดลหนึ่ง:
foundry model run phi-4-mini
ขั้นตอนที่ 2: สร้างและรันแอปพลิเคชัน
ในเทอร์มินัลอีกหน้าหนึ่ง:
cd 04-PracticalSamples/foundrylocal
mvn spring-boot:run
หรือสร้างและรันเป็นไฟล์ JAR:
mvn clean package
java -jar target/foundry-local-spring-boot-0.0.1-SNAPSHOT.jar
ผลลัพธ์ที่คาดหวัง
=== Foundry Local Demo ===
Calling Foundry Local service...
Sending message: Hello! Can you tell me what you are and what model you're running?
Response from Foundry Local:
Hello! I'm Phi, an AI developed by Microsoft. I can assist with a wide variety of
tasks including answering questions, helping with analysis, creative writing, coding,
and general conversation. How can I help you today?
=========================
ขั้นตอนถัดไป
สำหรับตัวอย่างเพิ่มเติม ดู บทที่ 04: ตัวอย่างปฎิบัติ
การแก้ไขปัญหา
ปัญหาที่พบได้บ่อย
"Connection refused" หรือ "Service unavailable"
- ตรวจสอบบริการ:
foundry service status - รีสตาร์ทหากจำเป็น:
foundry service restart - ตรวจสอบให้แน่ใจว่าพอร์ตใน
application.propertiesตรงกับผลลัพธ์foundry service status - ตรวจสอบให้ URL ลงท้ายด้วย
/v1:http://localhost:5273/v1
"ไม่พบโมเดล" ตอนเริ่มแอป
- แอปจะตรวจจับโมเดลเองโดยอัตโนมัติ ให้แน่ใจว่าอย่างน้อยมีโมเดลหนึ่งโหลด:
foundry service ps - หากไม่มีโมเดล โหลดโมเดลด้วย:
foundry model run phi-4-mini - ถ้าคุณตั้งชื่อโมเดลใน
application.propertiesให้ตรวจสอบว่าตรงกับชื่อจากfoundry model list
ข้อผิดพลาด "400 Bad Request"
- ตรวจสอบว่า base URL มี
/v1รวมอยู่:http://localhost:5273/v1 - ตรวจสอบว่าใช้
maxCompletionTokens()ในโค้ดแทนmaxTokens()ที่เลิกใช้งานแล้ว
ข้อผิดพลาดคอมไพล์ Maven
- ตรวจสอบ Java 21 ขึ้นไป:
java -version - ล้างและคอมไพล์ใหม่:
mvn clean compile - ตรวจสอบการเชื่อมต่ออินเทอร์เน็ตเพื่อดาวน์โหลด dependencies
ปัญหาการเชื่อมต่อบริการ
- ถ้าเห็นข้อความ
Request to local service failedให้รัน:foundry service restart - ตรวจสอบโมเดลที่โหลด:
foundry service ps - ดูบันทึกของบริการ:
foundry service diag
ข้อจำกัดความรับผิดชอบ: เอกสารฉบับนี้ได้รับการแปลโดยใช้บริการแปลภาษาของ AI Co-op Translator แม้ว่าเราจะพยายามให้มีความถูกต้อง แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลโดยมนุษย์มืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดใด ๆ ที่เกิดขึ้นจากการใช้การแปลนี้