TalentLLM / TalentLLM-main /notebooks /compator_parallel.py
AzeezIsh's picture
Upload 71 files
37d3a3b
import openai;
import json, os, threading
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.environ.get("OPENAI_API_KEY")
from Candidate import JobCandidate
def getContent(resumeA: str, resumeB: str) -> str:
return (
"Given the following two SWE candidates, choose between the two. Here is the rubric: "
+ get_rubric()
+ "Candidate A: "
+ "\nRESUME:\n" +resumeA+"\nEND Resume\n"
+ " END OF Candidate A"
+ "\n\nCandidate B: "
+ "\nRESUME:\n" +resumeB+"\nEND Resume\n"
+ " END OF Candidate B"
)
def compare_resumes(content:str):
choice =0
response = openai.ChatCompletion.create(
model="gpt-4-0613",
messages=[{"role": "user", "content": content}],
functions=[
{
"name": "selectCanidate",
"description": "choose between the two canidates",
"parameters": {
"type": "object",
"properties": {
"choice_num": {
"type": "integer",
"description": "1 for Candidate A is the best fit, 2 for Candidate B is the best fit",
"required": ["choice_num"],
},
"justifcation": {
"type": "string",
"description": "justifcation for why you chose the candidate",
"required": ["justifcation"],
},
}
},
}
],
function_call="auto",
)
message = response["choices"][0]["message"]
if message.get("function_call"):
function_name = message["function_call"]["name"]
function_args = json.loads(message["function_call"]["arguments"])
if function_name == "selectCanidate":
choice = (int(function_args["choice_num"]))
print(function_args["justifcation"])
return choice
def get_rubric():
text = open("rubric.txt","r").read()
return "\nRubric:\n" +str(text)+"\nEND Rubric\n"
def comp_parallel(candidateA: JobCandidate, candidateB: JobCandidate, rub_id: int, comp_table: dict, lock: threading.Lock):
tag = f"{candidateA.email}#{candidateB.email}#{rub_id}"
if tag not in comp_table:
choice = compare_resumes(getContent(candidateA.resume_text, candidateB.resume_text))
if choice == 1:
choice = -1
elif choice == 2:
choice = 1
with lock:
comp_table[tag] = choice
def pre_compute_comparisons(candidates: list, rub_id: int = 0) -> dict:
comp_table= json.load(open("comparisons.json","r"))
lock = threading.Lock()
threads = []
for i in range(len(candidates)):
for j in range(i + 1, len(candidates)):
thread = threading.Thread(target=comp_parallel, args=(candidates[i], candidates[j], rub_id, comp_table, lock))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
json.dump(comp_table, open("comparisons.json","w"))
return comp_table
def bubble_sort(candidates: list, rub_id: int = 0) -> list:
n = len(candidates)
comp_table = pre_compute_comparisons(candidates, rub_id)
for i in range(n):
for j in range(n - i - 1):
tag = f"{candidates[j].email}#{candidates[j + 1].email}#"+str(rub_id)
if comp_table[tag] > 0:
candidates[j], candidates[j + 1] = candidates[j + 1], candidates[j]
return candidates