Skip to content

Commit 17ed87f

Browse files
authored
Merge 17e28f0 into 906cf53
2 parents 906cf53 + 17e28f0 commit 17ed87f

File tree

4 files changed

+43
-32
lines changed

4 files changed

+43
-32
lines changed

be_repo/modules/job_recommendation_system.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ def job_recommend(resume_text, user_id):
3131
password=NEO4J_PASSWORD
3232
)
3333

34+
node_label = "JTitle" # Adjust as needed; could be dynamic based on user input or other criteria
35+
3436
# Initialize Controller Components
3537
resume_processor = ResumeProcessor()
3638
retrieval_engine = RetrievalEngine(resume_processor, neo4j_model)
@@ -40,7 +42,7 @@ def job_recommend(resume_text, user_id):
4042
view = CLIView()
4143

4244
# Perform Mixed Retrieval
43-
similar_docs, graph_results = retrieval_engine.perform_mixed_retrieval(resume_text, node_label='JTitle')
45+
similar_docs, graph_results = retrieval_engine.perform_mixed_retrieval(resume_text, node_label=node_label)
4446

4547
if not similar_docs and not graph_results:
4648
return 'No job recommendations found based on your resume.'

be_repo/modules/recommendation_generator.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,36 +9,42 @@ def merge_results(self, vector_docs, graph_results):
99

1010
# Process vector similarity results
1111
for doc in vector_docs:
12-
comp = doc.metadata.get("comp", "")
13-
resp = doc.metadata.get("resp", "")
14-
job_title = f"{resp} at {comp}".strip()
15-
if job_title:
16-
combined_jobs[job_title] = combined_jobs.get(job_title, 0) + 1
12+
# Exclude 'id' and get all other non-empty metadata properties
13+
metadata = {k: v for k, v in doc.metadata.items() if k != 'id' and v}
14+
# Create a description string from the non-empty properties
15+
job_description = ', '.join(f"{k}: {v}" for k, v in metadata.items())
16+
if job_description:
17+
combined_jobs[job_description] = combined_jobs.get(job_description, 0) + 1
1718

1819
# Process graph traversal results
19-
# Access the context from intermediate steps
2020
intermediate_steps = graph_results.get('intermediate_steps', [])
2121
if len(intermediate_steps) > 1:
2222
context = intermediate_steps[1].get('context', [])
2323
for job in context:
24-
job_title = job.get('job_title', '')
25-
company = job.get('company', '')
26-
if job_title and company:
27-
combined_job = f"{job_title} at {company}"
28-
combined_jobs[combined_job] = combined_jobs.get(combined_job, 0) + 1
24+
# Exclude 'id' and get all other non-empty properties
25+
job_data = {k: v for k, v in job.items() if k != 'id' and v}
26+
# Create a description string
27+
job_description = ', '.join(f"{k}: {v}" for k, v in job_data.items())
28+
if job_description:
29+
combined_jobs[job_description] = combined_jobs.get(job_description, 0) + 1
30+
31+
# Include the 'result' from 'graph_results' directly
32+
graph_result_text = graph_results.get('result', '').strip()
33+
if graph_result_text:
34+
combined_jobs[graph_result_text] = combined_jobs.get(graph_result_text, 0) + 1
2935

3036
# Convert to sorted list based on combined score
3137
sorted_jobs = sorted(combined_jobs.items(), key=lambda item: item[1], reverse=True)
3238
return [job for job, score in sorted_jobs]
33-
39+
3440
def generate_recommendations(self, vector_docs, graph_results):
3541
"""
3642
Generate a ranked list of job recommendations by merging vector and graph results.
37-
43+
3844
Parameters:
3945
vector_docs (List[Document]): Documents from vector similarity search.
4046
graph_results (dict): Results from graph traversal.
41-
47+
4248
Returns:
4349
List[str]: Ranked list of unique job recommendations.
4450
"""

be_repo/modules/retrieval_engine.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
# retrieval_engine.py
22

3+
from langchain_neo4j import GraphCypherQAChain
4+
from langchain_openai import ChatOpenAI
5+
from langchain.chains.retrieval import create_retrieval_chain
36
from langchain.chains.combine_documents import create_stuff_documents_chain
4-
from langchain.chains.retrieval import create_retrieval_chain
7+
from configs.openai_key import get_openai_api_key # New import
58
from langchain.prompts import PromptTemplate
69

7-
810
class RetrievalEngine:
911
def __init__(self, resume_processor, neo4j_model):
1012
"""
@@ -19,7 +21,7 @@ def __init__(self, resume_processor, neo4j_model):
1921

2022
# Initialize Language Model (already initialized in Neo4jModel)
2123
self.llm = self.neo4j_model.llm
22-
24+
2325
# Initialize GraphCypherQAChain (already initialized in Neo4jModel)
2426
self.graph_chain = self.neo4j_model.get_graph_chain()
2527

@@ -51,12 +53,12 @@ def __init__(self, resume_processor, neo4j_model):
5153
{context}
5254
\"\"\"
5355
""",
54-
input_variables=["input"]
56+
input_variables=["input"]
5557
)
5658

57-
# Create a documents chain
59+
# Create a documents chain
5860
self.combine_docs_chain = create_stuff_documents_chain(self.llm, prompt=prompt)
59-
61+
6062
# Initialize Retrieval Chain
6163
# Default node_label is 'JD'; can be adjusted as needed
6264
self.retrieval_chain = create_retrieval_chain(
@@ -77,13 +79,13 @@ def perform_mixed_retrieval(self, resume_text, node_label="JD"):
7779
"""
7880
# Process resume into a Document
7981
doc = self.resume_processor.process_resume(resume_text)
80-
82+
8183
if not doc:
8284
return [], {}
83-
85+
8486
# Store the Document in the appropriate vector store
8587
self.neo4j_model.store_documents([doc], node_label=node_label)
86-
88+
8789
# Access the schema property correctly
8890
schema = self.neo4j_model.graph.get_schema
8991

@@ -92,15 +94,16 @@ def perform_mixed_retrieval(self, resume_text, node_label="JD"):
9294
similar_docs = similar_docs_result.get("output", [])
9395
print("similar_docs_result:", similar_docs_result)
9496
print("Keys in similar_docs_result:", similar_docs_result.keys())
97+
98+
9599

96100
for doc in similar_docs:
97101
print("Document Metadata:", doc.metadata)
98102

99-
query = (f"Based on the following resume, recommend relevant job positions based on skills and experience, "
100-
f"while ignoring the location: {resume_text}")
103+
query = f"Based on the following resume, recommend relevant job positions: {resume_text}"
101104
graph_response = self.graph_chain.invoke({"query": query, "schema": schema})
102105
# After graph query
103106
print("Graph Response:")
104107
print(graph_response)
105-
106-
return similar_docs, graph_response
108+
109+
return similar_docs, graph_response

be_repo/modules/view.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ def display_recommendations(self, recommendations):
2828
Display job recommendations to the user.
2929
"""
3030
if not recommendations:
31-
return 'No job recommendations found based on your resume.'
32-
res = '\nRecommended Jobs for You:\n'
31+
print("No job recommendations found based on your resume.")
32+
return
33+
print("\nRecommended Jobs for You:")
3334
for idx, job in enumerate(recommendations, start=1):
34-
res += f'{idx}. {job}\n'
35-
return res
35+
print(f"{idx}. {job}")

0 commit comments

Comments
 (0)