Skip to content

Commit f412932

Browse files
andyasdd1Linchen-Xu
authored andcommitted
Add New Modules: GraphCypherQAChain. Add New Preprocess modules: embedding and nodes retrival. Added New Config: OpenAi key retrieve
embedding.py graph-preprocess-simpl.py neo4j_import.py openai_key.py job_recommendation_system.py neo4j_model.py recommendation_generator.py resume_processor.py retrieval_engine.py verify.py view.py
1 parent fccb46a commit f412932

File tree

3 files changed

+65
-44
lines changed

3 files changed

+65
-44
lines changed
Lines changed: 45 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,75 @@
11
# job_recommendation_system.py
22

3-
import logging
3+
from neo4j_model import Neo4jModel
4+
from resume_processor import ResumeProcessor
5+
from retrieval_engine import RetrievalEngine
6+
from recommendation_generator import RecommendationGenerator
7+
from view import CLIView
8+
import sys
49

5-
from .neo4j_model import Neo4jModel
6-
from .recommendation_generator import RecommendationGenerator
7-
from .resume_processor import ResumeProcessor
8-
from .retrieval_engine import RetrievalEngine
9-
from .view import CLIView
10+
def main():
11+
12+
13+
# Redirect standard output to a file
14+
sys.stdout = open('output.log', 'w')
15+
16+
# Your code here
17+
print("Lots of output")
1018

1119

12-
def job_recommend(resume_text, user_id):
1320
# Setup Logging
21+
import logging
1422
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
1523
logger = logging.getLogger(__name__)
16-
17-
# Get Resume Input from User
18-
if not resume_text.strip():
19-
logger.error(f'No resume text provided, user_id: {user_id}.')
20-
return 'Error: No resume text provided.'
21-
24+
2225
# Neo4j Connection Details
2326
NEO4J_URI = "neo4j+ssc://7bf5a48e.databases.neo4j.io" # Replace with your Neo4j URI
24-
NEO4J_USERNAME = "neo4j" # Replace with your Neo4j username
25-
NEO4J_PASSWORD = "oxsK7V5_86emZlYQlvCfQHfVWS95wXz29OhtU8GAdFc" # Replace with your Neo4j password
27+
NEO4J_USERNAME = "neo4j" # Replace with your Neo4j username
28+
NEO4J_PASSWORD = "oxsK7V5_86emZlYQlvCfQHfVWS95wXz29OhtU8GAdFc" # Replace with your Neo4j password
2629

2730
# Initialize Model
2831
neo4j_model = Neo4jModel(
2932
uri=NEO4J_URI,
3033
username=NEO4J_USERNAME,
3134
password=NEO4J_PASSWORD
3235
)
33-
34-
node_label = "JTitle" # Adjust as needed; could be dynamic based on user input or other criteria
35-
36+
3637
# Initialize Controller Components
3738
resume_processor = ResumeProcessor()
3839
retrieval_engine = RetrievalEngine(resume_processor, neo4j_model)
3940
recommendation_generator = RecommendationGenerator()
40-
41+
4142
# Initialize View
4243
view = CLIView()
43-
44-
# Perform Mixed Retrieval
44+
45+
# Get Resume Input from User
46+
resume_text = view.get_resume_input()
47+
48+
if not resume_text.strip():
49+
logger.error("No resume text provided.")
50+
print("Error: No resume text provided.")
51+
return
52+
53+
# Perform Mixed Retrieval for 'JD' Node Label
54+
node_label = "JD" # Adjust as needed; could be dynamic based on user input or other criteria
4555
similar_docs, graph_results = retrieval_engine.perform_mixed_retrieval(resume_text, node_label=node_label)
46-
56+
4757
if not similar_docs and not graph_results:
48-
return 'No job recommendations found based on your resume.'
49-
58+
print("No job recommendations found based on your resume.")
59+
return
60+
5061
# Generate Recommendations
5162
try:
5263
recommendations = recommendation_generator.generate_recommendations(similar_docs, graph_results)
5364
except Exception as e:
54-
return 'Error: Failed to generate job recommendations.'
55-
65+
print("Error: Failed to generate job recommendations.")
66+
return
67+
5668
# Display Recommendations
57-
return view.display_recommendations(recommendations)
69+
view.display_recommendations(recommendations)
70+
71+
# Close the file
72+
sys.stdout.close()
73+
74+
if __name__ == "__main__":
75+
main()

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)