File size: 9,556 Bytes
352d473 c672d1b 5cb8fb6 75c603a 352d473 f9f18b4 79da7a3 f9f18b4 79da7a3 75c603a 79da7a3 75c603a 79da7a3 75c603a 79da7a3 f9f18b4 79da7a3 75c603a f9f18b4 79da7a3 f9f18b4 79da7a3 5cb8fb6 79da7a3 f9f18b4 79da7a3 75c603a 5cb8fb6 79da7a3 efc4ecf 5cb8fb6 79da7a3 f9f18b4 79da7a3 75c603a 79da7a3 75c603a 79da7a3 5cb8fb6 efc4ecf 79da7a3 75c603a 79da7a3 75c603a f9f18b4 79da7a3 75c603a f9f18b4 75c603a efc4ecf 75c603a 79da7a3 75c603a 79da7a3 75c603a 79da7a3 75c603a f9f18b4 5cb8fb6 79da7a3 f9f18b4 79da7a3 473251f 35e8298 79da7a3 75c603a a05bcb9 75c603a f2357ce 75c603a 79da7a3 75c603a 79da7a3 75c603a 79da7a3 f73c0d1 f9f18b4 35e8298 79da7a3 75c603a 79da7a3 75c603a f73c0d1 35e8298 75c603a f9f18b4 75c603a f9f18b4 35e8298 f73c0d1 a05bcb9 f9f18b4 5cb8fb6 79da7a3 a05bcb9 f9f18b4 05ce7a2 a05bcb9 75c603a f9f18b4 f73c0d1 a05bcb9 f73c0d1 75c603a 352d473 35e8298 5cb8fb6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 |
import streamlit as st
import json
from typing import Dict, List, Any
import re
def format_project_response(project: dict, indent_level: int = 0) -> str:
"""Format project details with proper indentation and spacing"""
indent = " " * indent_level
response = [f"\n{indent}• {project['name']}:"]
# Add description with proper indentation
description_lines = project['description'].split('. ')
response.extend([f"{indent} {line.strip()}." for line in description_lines])
# Add technologies with proper line break
if 'skills_used' in project:
response.append(f"\n{indent} Technologies: {', '.join(project['skills_used'])}")
# Add status and notes
if 'status' in project:
status = project['status']
if 'development' in status.lower() or 'progress' in status.lower():
response.append(f"\n{indent} Status: {status}")
if 'confidentiality_note' in project:
response.append(f"{indent} Note: {project['confidentiality_note']}")
return '\n'.join(response) + '\n'
def analyze_job_requirements(text: str, knowledge_base: dict) -> Dict[str, List[str]]:
"""Analyze job requirements and match with skills"""
text_lower = text.lower()
# Common ML/AI related keywords
tech_keywords = {
'machine learning': ['ml', 'machine learning', 'deep learning', 'neural networks'],
'data science': ['data science', 'data analysis', 'analytics', 'statistics'],
'programming': ['python', 'sql', 'programming', 'coding'],
'tools': ['tableau', 'powerbi', 'visualization', 'git'],
'cloud': ['aws', 'azure', 'cloud', 'deployment']
}
# Extract matches from knowledge base
matches = {category: [] for category in tech_keywords}
my_skills = {
skill.lower()
for skill_type in knowledge_base['skills']['technical_skills'].values()
for skill_list in skill_type.values()
for skill in skill_list
}
# Find matching skills in each category
for category, keywords in tech_keywords.items():
for keyword in keywords:
if keyword in text_lower and any(skill in keyword or keyword in skill for skill in my_skills):
matches[category].append(keyword)
return matches
def handle_perspective_query(query: str, knowledge_base: dict) -> str:
"""Handle philosophical or perspective-based queries"""
query_lower = query.lower()
perspectives = knowledge_base.get('perspectives', {})
# Market-related queries
if any(word in query_lower for word in ['market', 'opportunity', 'job', 'hiring']):
if any(word in query_lower for word in ['down', 'bad', 'difficult', 'tough']):
response_parts = [
"• My Perspective on the Current Market:",
f" {perspectives['market_outlook']['job_market']}",
"",
"• My Strategic Approach:",
f" {perspectives['market_outlook']['strategy']}",
"",
"• My Unique Value Proposition:",
f" {perspectives['market_outlook']['value_proposition']}"
]
return '\n'.join(response_parts)
# Learning and growth queries
elif any(word in query_lower for word in ['learn', 'study', 'growth']):
return f"• My Learning Philosophy:\n {perspectives['learning_philosophy']}"
# Handle non-portfolio queries gracefully
return knowledge_base['common_queries']['general']
def generate_response(query: str, knowledge_base: dict) -> str:
"""Generate enhanced responses using the knowledge base"""
query_lower = query.lower()
# Handle project listing requests
if any(word in query_lower for word in ['list', 'project', 'portfolio', 'built', 'created', 'developed']):
response_parts = ["Here are my key projects:"]
# Major Projects (under development)
response_parts.append("\nMajor Projects (In Development):")
for project in knowledge_base['projects']['major_projects']:
response_parts.append(format_project_response(project, indent_level=1))
# Algorithm Implementation Projects
response_parts.append("\nCompleted Algorithm Implementation Projects:")
for project in knowledge_base['projects']['algorithm_practice_projects']:
response_parts.append(format_project_response(project, indent_level=1))
response = '\n'.join(response_parts)
return add_relevant_links(response, query, knowledge_base)
# Handle job description analysis
elif len(query.split()) > 20 and any(phrase in query_lower for phrase in
['requirements', 'qualifications', 'looking for', 'job description']):
matches = analyze_job_requirements(query, knowledge_base)
relevant_projects = find_relevant_projects(query, knowledge_base['projects']['major_projects'])
response_parts = ["Based on the job requirements, here's how my profile aligns:\n"]
# Technical Skills Match
if any(matches.values()):
response_parts.append("• Technical Skills Alignment:")
for category, skills in matches.items():
if skills:
response_parts.append(f" - Strong {category} skills: {', '.join(skills)}")
response_parts.append("")
# Project Experience
if relevant_projects:
response_parts.append("• Relevant Project Experience:")
for project in relevant_projects:
desc = f" - {project['name']}: {project['description']}"
response_parts.append(desc)
response_parts.append("")
# Education and Background
response_parts.extend([
"• Education and Background:",
" - Advanced AI/ML education in Canada",
" - Unique commerce background providing business perspective",
" - Strong foundation in practical ML implementation",
""
])
return '\n'.join(response_parts)
# Handle perspective/philosophical queries
elif any(word in query_lower for word in ['market', 'think', 'believe', 'opinion', 'weather']):
return handle_perspective_query(query, knowledge_base)
# Handle story/background queries
elif any(word in query_lower for word in ['background', 'journey', 'story', 'transition']):
return format_story_response(knowledge_base)
# Default response
return format_default_response(knowledge_base)
def main():
st.title("🤖 Meet Rini - AI-Powered Insights on Manyue's World")
# Initialize session state
if "messages" not in st.session_state:
st.session_state.messages = []
if "knowledge_base" not in st.session_state:
try:
with open('knowledge_base.json', 'r', encoding='utf-8') as f:
st.session_state.knowledge_base = json.load(f)
except FileNotFoundError:
st.error("Knowledge base file not found.")
return
# Display welcome message
if "displayed_welcome" not in st.session_state:
st.write("""
Hi there! I'm Rini, Manyue's AI-powered assistant. I'm here to represent Manyue and share insights about:
- My journey from commerce to ML/AI
- My technical skills and projects
- My fit for ML/AI roles
- My perspective on the tech industry
- You can also paste job descriptions to see how my profile matches!
""")
st.session_state.displayed_welcome = True
# Create two columns with chat history in scrollable container
col1, col2 = st.columns([3, 1])
with col1:
# Chat container for better scrolling
chat_container = st.container()
with chat_container:
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# Chat input at bottom
if prompt := st.chat_input("Ask me anything or paste a job description..."):
# Add user message
st.session_state.messages.append({"role": "user", "content": prompt})
try:
# Generate and display response
with st.chat_message("assistant"):
response = generate_response(prompt, st.session_state.knowledge_base)
st.markdown(response)
st.session_state.messages.append({"role": "assistant", "content": response})
except Exception as e:
st.error(f"An error occurred: {str(e)}")
st.rerun()
with col2:
st.subheader("Quick Questions")
example_questions = [
"Tell me about your ML projects",
"What are your technical skills?",
"What makes you stand out?",
"What's your journey into ML?",
"Your view on the current market?"
]
for question in example_questions:
if st.button(question):
st.session_state.messages.append({"role": "user", "content": question})
st.rerun()
st.markdown("---")
if st.button("Clear Chat"):
st.session_state.messages = []
st.rerun()
if __name__ == "__main__":
main() |