บทความนี้เหมาะสำหรับบริษัทหรือ HR ที่ต้องการใช้ AI ช่วยลดเวลาในการคัดกรองผู้สมัคร เพราะเราจะมาดูวิธีวิเคราะห์ resumes ด้วย Gemini ผ่าน OpenAI library ใน Python กัน
บทความนี้แบ่งเป็น 3 ส่วนตามขั้นตอนการวิเคราะห์ ได้แก่:
- Install and load libraries
- Set input
- Analyse resumes
โดยเราจะไปดูตัวอย่างโดยใช้ Google Colab กัน (ดู code ทั้งหมดได้ที่นี่)
ถ้าพร้อมแล้ว ไปเริ่มกันเลย
- ⬇️ 1. Install & Load Libraries
- 🔧 2. Set the Input
- ⚡ 3. Analyse the Resumes
- 😺 Code & Input Examples
- 📃 References
⬇️ 1. Install & Load Libraries
ในขั้นแรก เราจะเรียกติดตั้งและโหลด libraries ที่จำเป็นดังนี้:
openai: สำหรับเรียกใช้ AI ผ่าน APIdriveจากgoogle.colab: สำหรับเชื่อมต่อกับไฟล์ใน Google DrivePyPDF2: สำหรับดึง text ออกจากไฟล์ PDFtextwrap: สำหรับลบย่อหน้าออกจาก stringConsoleจากrich.consoleและMarkdownจากrich.markdown: สำหรับ render การแสดงผล string ให้อ่านง่ายขึ้น
ติดตั้ง:
# Install libraries
!pip install PyPDF2
Note: Google Colab มี libraries อื่น ๆ อยู่แล้ว ทำให้เราแค่ต้องติดตั้ง PyPDF2 อย่างเดียว
โหลด:
# Load libraries
# Connect to Gemini
from openai import OpenAI
# Connect to Google Drive
from google.colab import drive
# Extract text from PDF
import PyPDF2
# Dedent text
import textwrap
# Render markdown text
from rich.console import Console
from rich.markdown import Markdown
🔧 2. Set the Input
สำหรับการวิเคราะห์ resumes เราต้องการ input 3 อย่าง ได้แก่:
- Client: สำหรับเรียกใช้ Gemini API
- Job description (JD): รายละเอียดตำแหน่งงานที่กำลังต้องการพนักงาน
- Resumes: ข้อมูล resume ที่เราต้องการวิเคราะห์
เราไปดูวิธีกำหนด input แต่ละตัวกัน
.
🧑💻 (1) Client
เราสามารถกำหนด client ได้ด้วย OpenAI() ซึ่งต้องการ 2 arguments:
api_key: API key สำหรับเชื่อมต่อ APIbase_url: base URL สำหรับเรียกใช้ AI service ซึ่งสำหรับ Gemini เราต้องกำหนดเป็น"<https://generativelanguage.googleapis.com/v1beta/openai/>"
ในตัวอย่าง เราจะเรียกใช้ OpenAI() แบบนี้:
# Create a client
client = OpenAI(api_key="YOUR_API_KEY", base_url="<https://generativelanguage.googleapis.com/v1beta/openai/>")
Note: ในกรณีใช้งานจริง ให้แทนที่ "YOUR_API_KEY" ด้วย API key จริง (ดูวิธีสร้าง API key ฟรีได้ที่ Using Gemini API keys)
.
💼 (2) JD
Input ที่ 2 สำหรับการวิเคราะห์ คือ JD ซึ่งเราสามารถกำหนดเป็น string ได้แบบนี้:
# Set the job description (JD)
web_dev_jd = """
Senior Web Developer
We're looking for a Senior Web Developer with a strong background in front-end development and a passion for creating dynamic, intuitive web experiences. The ideal candidate will have extensive experience with the entire development lifecycle, from project conception to final deployment and quality assurance. This role requires a blend of technical skill, creative collaboration, and a commitment to solving complex programming challenges.
Responsibilities
* Cooperate with designers to create clean, responsive interfaces and intuitive user experiences.
* Develop and maintain project concepts, ensuring an optimal workflow throughout the development cycle.
* Work with a team to manage large, complex design projects for corporate clients.
* Complete detailed programming tasks for both front-end and back-end server code.
* Conduct quality assurance tests to discover errors and optimize usability for all projects.
Qualifications
* Bachelor's degree in Computer Information Systems or a related field.
* Proven experience in all stages of the development cycle for dynamic web projects.
* Expertise in programming languages including PHP OOP, HTML5, JavaScript, CSS, and MySQL.
* Familiarity with various PHP frameworks such as Zend, Codeigniter, and Symfony.
* A strong background in project management and customer relations.
"""
Note: ในกรณีที่ JD เป็นไฟล์ PDF เราสามารถใช้วิธีดึงข้อมูลแบบเดียวกันกับ resumes ได้
.
📄 (3) Resumes
Input สุดท้าย คือ resumes ที่เราต้องการวิเคราะห์
ในตัวอย่าง เราจะดึงข้อมูล resumes จากไฟล์ PDF ใน Google Drive ใน 3 ขั้นตอน ได้แก่:
ขั้นที่ 1. เชื่อมต่อ Google Drive ด้วย drive.mount():
# Connect to Google Drive
drive.mount("/content/drive")
Note: Google จะถามยืนยันการให้สิทธิ์เข้าถึงไฟล์ใน Drive ให้เรากดยืนยันเพื่อไปต่อ
ขั้นที่ 2. กำหนด file path ของไฟล์ PDF ใน Google Drive:
# Set resume file paths
rs_file_paths = {
"George Evans": "/content/drive/My Drive/Resumes/cv_george_evans.pdf",
"Robert Richardson": "/content/drive/My Drive/Resumes/cv_robert_richardson.pdf",
"Christine Smith": "/content/drive/My Drive/Resumes/cv_christine_smith.pdf"
}
Note: ในตัวอย่าง จะเห็นว่า เรามี resumes 3 ใบ (ดาวน์โหลด resumes ฟรีได้ที่ www.coolfreecv.com)
ขั้นที่ 3. ดึง text ออกจาก resumes ด้วย for loop และ PyPDF2:
# Extract resume texts
# Instantiate a collector
rs_texts = {}
# Loop through resume files to get text
for key in rs_file_paths:
# Instantiate an empty string to store the extracted text
rs_text = ""
# Open the PDF file
reader = PyPDF2.PdfReader(rs_file_paths[key])
# Loop through the pages
for i in range(len(reader.pages)):
# Extract the text from the page
text = reader.pages[i].extract_text()
# Append the text to the string
rs_text += text
# Collect the extracted text
rs_texts[key] = rs_text
ตัวอย่าง PDF และข้อมูลที่ดึงจาก PDF:

Contact
+1 (970) 343 888 999
george.evans@gmail.com
<https://www.coolfreecv.com>
32 ELM STREET MADISON, SD
57042
George Evans
PHP / OOP
Zend Framework Summary
Senior Web Developer specializing in front end development .
Experienced with all stages of the development cycle for dynamic
web projects. Well -versed in numerous programming languages
including HTML5, PHP OOP, JavaScript, CSS, MySQL. Strong
background in project management and customer relations.
Perceived as versatile, unconventional and committed, I am
looking for new and interesting programming challenges.
Experience
Web Developer - 09/201 8 to 05/20 22
Luna Web Design, New York
• Cooperate with designers to create clean interfaces and
simple, intuitive interactions and experiences.
• Develop project concepts and maintain optimal workflow.
• Work with senior developer to manage large, complex
design projects for corporate clients.
• Complete detailed programming and development tasks
for front end public and internal websites as well as
challenging back -end server code.
• Carry out quality assurance tests to discover errors and
optimize usability.
Education
Bachelor of Science: Computer Information Systems - 2018
Columbia University, NY
Certifications
PHP Framework (certificate): Zend, Codeigniter, Symfony.
Programming Languages: JavaScript, HTML5, PHP OOP, CSS, SQL,
MySQL.
Reference
Adam Smith - Luna Web Design
adam.smith@luna.com +1(970 )555 555 Skills
JavaScript Symfony Framework
⚡ 3. Analyse the Resumes
ในขั้นสุดท้าย เราจะเปรียบเทียบความเหมาะสมของ resumes กับตำแหน่งงาน (JD) ใน 4 ขั้นตอน ดังนี้:
- สร้าง function เพื่อเรียกใช้ Gemini
- สร้าง function เพื่อใส่ input ใน prompt
- วิเคราะห์ resumes โดยใช้ for loop และ functions จากข้อ 1, 2
- Print ผลการวิเคราะห์
.
🤖 (1) Function เรียกใช้งาน Gemini
ในขั้นแรก เราจะสร้าง function สำหรับเรียกใช้ Gemini เพื่อให้ง่ายในการใช้งาน AI
ในตัวอย่าง เราจะกำหนด 3 arguments สำหรับ function:
prompts: list เก็บ system prompt และ user promptmodel: model ของ Gemini ที่เราจะเรียกใช้ (เช่น Gemini 2.5 Flash)temp: ระดับความคิดสร้างสรรค์ของ model โดยมีค่าระหว่าง 0 และ 2 โดย 0 จะทำให้ model ให้คำตอบเหมือนกันทุกครั้ง และ 2 คำตอบจะแตกต่างกันทุกครั้ง
# Create a function to get a Gemini response
def get_gemini_response(prompts, model, temp):
# Generate a response
response = client.chat.completions.create(
# Set the prompts
messages=prompts,
# Set the model
model=model,
# Set the temperature
temperature=temp
)
# Return the response
return response.choices[0].message.content
.
➕ (2) Function ใส่ Input ใน Prompt
ในขั้นที่ 2 เราจะสร้าง function เพื่อประกอบ input เข้ากับ prompt เพื่อพร้อมที่จะนำไปใช้ใน function ในขั้นที่ 1
ในตัวอย่างเราจะสร้าง function แบบนี้:
# Create a function to concatenate prompt + JD + resume
def concat_input(jd_text, rs_text):
# Set the system prompt
system_prompt = """
# 1. Your Role
You are an expert technical recruiter and resume analyst.
"""
# Set the user prompt
user_prompt = f"""
# 2. Your Task
Your task is to meticulously evaluate a candidate's resume against a specific job description (JD) and provide a detailed pre-screening report.
Your analysis must be structured with the following sections and include specific, data-driven insights.
## 1. Strengths
- Identify and elaborate on top three key strengths.
- For each strength, briefly provide specific evidence from the resume (e.g., "The candidate's experience with Python and Django, as shown in their role at Acme Corp, directly addresses the JD's requirement for...") and explain how it directly fulfills a requirement in the JD.
## 2. Weaknesses
- Identify top three areas where the candidate's experience or skills may not fully align with the JD's requirements.
- For each point, briefly explain the potential concern and why it might be a risk for the role (e.g., "The JD requires experience with AWS, but the resume only mentions exposure to Azure. This could indicate a gap in cloud infrastructure expertise.").
## 3. Candidate Summary
- Draft a concise summary of the candidate's professional background.
- Emphasise their JD-relevant core responsibilities, key achievements, and career progression as evidenced in the resume.
## 4. Overall Fit Score
- Provide a numerical score from 1 to 100, representing the overall alignment of the candidate's profile with the JD.
- A higher score indicates a stronger match: 80-100 = best match; 60-80 = strong match; 0-40 = weak match.
## 5. Hiring Recommendation
- Conclude with a clear, binary hiring recommendation: "🟢 Proceed to interview", "🟡 Add to waitlist", or "🔴 Do not proceed".
- Justify this recommendation with a brief, objective explanation based on the analysis above.
---
# 3. Your Output
- Use a professional and objective tone.
- Base your analysis solely on the provided resume and JD. Do not make assumptions.
- Be concise and to the point; no more than 30 words per sentence; the hiring manager needs to quickly grasp the key findings.
- Format your final report using markdown headings and bullet points for readability.
Output template:
'''
# [candidate's name (Title Case)] ([fit score]/100)
[recommendation]: [justification]
## Profile Summary:
[summary]
## Strengths:
- [strength 1]
- [strength 2]
- [strength 3]
## Weaknesses:
- [weakness 1]
- [weakness 2]
- [weakness 3]
'''
---
# 4. Your Input
**1. JD:**
{jd_text}
**2. Resume:**
{rs_text}
---
Generate the report.
"""
# Collect prompts
prompts = [
{
"role": "system",
"content": textwrap.dedent(system_prompt)
},
{
"role": "user",
"content": textwrap.dedent(user_prompt)
}
]
# Return the prompts
return prompts
Note: เราใช้ textwrap.dedent() เพื่อลบย่อหน้าที่เกิดจาก indent ใน function ออกจาก prompt เพื่อป้องกันความผิดพลาดในการประมวลผลของ AI และประหยัด input token
.
🤔 (3) วิเคราะห์ Resumes
ในขั้นที่ 3 ซึ่งเป็นขั้นที่สำคัญที่สุด เราจะวิเคราะห์ resumes โดย:
- ใช้ functions จากขั้นที่ 1 และ 2 เพื่อสร้าง prompt และส่ง prompt ให้กับ Gemini
- ใช้
forloop เพื่อส่ง resumes ให้กับ Gemini จนครบทุกใบ
# Instantiate a response collector
results = {}
# Loop through the resumes
for rs_name, rs_text in rs_texts.items():
# Create the prompts
prompts = concat_input(web_dev_jd, rs_text)
# Get the Gemini response
response = get_gemini_response(prompts=prompts, model="gemini-2.5-flash", temp=0.5)
# Collect the response
results[rs_name] = response
เมื่อรัน code นี้แล้ว เราจะได้ผลลัพธ์เก็บไว้ใน results
.
👀 (4) Print ผลลัพธ์
สุดท้าย เราจะ print ผลการวิเคราะห์ออกมา โดย:
- ใช้
forloop ช่วย print ผลจนครบ - ใช้
ConsoleกับMarkdownเพื่อทำให้ข้อความอ่านง่ายขึ้น:
# Instantiate a console
console = Console()
# Instantiate a counter
i = 1
# Print the results
for rs_name, analysis_result in results.items():
# Print the resume name
print(f"👇 {i}. {rs_name}:")
# Print the response
console.print(Markdown(analysis_result))
# Add spacers and divider
print("\\n")
print("-----------------------------------------------------------")
print("\\n")
# Add a counter
i += 1
ตัวอย่างผลลัพธ์:

ในตัวอย่าง จะเห็นได้ว่า George Evans เหมาะที่จะเป็น Senior Web Developer
😺 Code & Input Examples
- ดูตัวอย่าง code ได้ที่ Google Colab
- ดูตัวอย่าง JD และ resumes ได้ที่ JD & Resumes

Leave a reply to Python for AI: รวบรวม 8 บทความการทำงานกับ AI ด้วย Python – Shi no Shigoto Cancel reply