My_Profile_Site / app.py
DeL-TaiseiOzaki's picture
Update app.py
67acbc5 verified
raw
history blame
48.8 kB
import streamlit as st
import os
import base64
from PIL import Image
import io
from datetime import datetime
import requests
# ページ設定
st.set_page_config(
page_title="Taisei Ozaki - AI Researcher",
page_icon="🚀",
layout="wide"
)
# セッションステートの初期化
if 'initialized' not in st.session_state:
st.session_state.initialized = True
if 'language' not in st.session_state:
st.session_state.language = 'ja'
if 'show_details' not in st.session_state:
st.session_state.show_details = {}
# 多言語コンテンツ
content = {
'ja': {
'subtitle': 'AI Researcher & Machine Learning Engineer',
'badges': ['🎓 博士後期課程 D1', '🤖 LLM Researcher', '🚗 LLM Agent', '🧠 LLM`s Implicit knowledge'],
'intro': """大阪公立大学の博士後期課程(D1)で<span style="color: var(--secondary); font-weight: 600;">機械工学とAI・NLP</span>を研究。<br>
<span style="color: var(--secondary); font-weight: 600;">LLMの暗黙知、AIエージェント、小型ビークルの自動運転</span>に焦点を当てた研究を行い、<br>
東京大学 松尾岩澤研究室,株式会社松尾研究所でも<span style="color: var(--secondary); font-weight: 600;">学術専門職員,データサイエンティスト</span>として活動中。""",
'current_position': '🏢 現在の所属',
'tech_stack': '💻 技術スタック',
'achievements': '🏆 主な実績',
'career': '📋 来歴',
'publications': '📚 研究発表',
'projects': '🚀 プロジェクト',
'social_links': '🌐 SNS & Links',
'contact': '📬 Contact',
'contact_intro': 'お問い合わせはこちらから'
},
'en': {
'subtitle': 'AI Researcher & Machine Learning Engineer',
'badges': ['🎓 PhD Student D1', '🤖 LLM Researcher', '🚗 LLM Agent', '🧠 LLM`s Implicit Knowledge'],
'intro': """PhD student (D1) at <span style="color: var(--secondary); font-weight: 600;">Osaka Metropolitan University</span> researching <span style="color: var(--secondary); font-weight: 600;">Mechanical Engineering and AI/NLP</span>.<br>
Focusing on <span style="color: var(--secondary); font-weight: 600;">LLM implicit knowledge, AI agents, and autonomous driving for small vehicles</span>,<br>
also working as an <span style="color: var(--secondary); font-weight: 600;">Academic Research Staff and Data Scientist</span> at the University of Tokyo Matsuo-Iwasawa Lab and Matsuo Institute.""",
'current_position': '🏢 Current Affiliations',
'tech_stack': '💻 Tech Stack',
'achievements': '🏆 Key Achievements',
'career': '📋 Career History',
'publications': '📚 Recent Publications',
'projects': '🚀 Ongoing Projects',
'social_links': '🌐 SNS & Links',
'contact': '📬 Contact',
'contact_intro': 'For research collaboration, technical consultation, or other inquiries'
}
}
# カスタムCSS(修正版)
st.markdown("""
<style>
/* Google Fontsのインポート */
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;900&family=JetBrains+Mono:wght@400;700&display=swap");
@import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css");
/* CSS変数 */
:root {
--primary: #D4AF37;
--primary-dark: #B8941F;
--secondary: #F4E4C1;
--accent: #FFD700;
--bg-dark: #0A0A0A;
--bg-card: rgba(20, 20, 20, 0.8);
--text-primary: #F5F5F5;
--text-secondary: #B8B8B8;
--gradient-1: linear-gradient(135deg, #D4AF37 0%, #8B6914 100%);
--gradient-2: linear-gradient(135deg, #FFD700 0%, #B8860B 100%);
}
/* 全体のスタイル */
.stApp {
background:
radial-gradient(ellipse at top left, rgba(212, 175, 55, 0.1), transparent 40%),
radial-gradient(ellipse at bottom right, rgba(139, 105, 20, 0.1), transparent 40%),
linear-gradient(180deg, #0A0A0A 0%, #141414 100%);
color: var(--text-primary);
min-height: 100vh;
}
/* フォント設定 */
html, body, [class*="css"] {
font-family: "Inter", -apple-system, BlinkMacSystemFont, sans-serif;
}
/* ヘッダー */
h1 {
font-size: 3.5rem !important;
font-weight: 900 !important;
background: var(--gradient-1);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
margin-bottom: 0.5rem !important;
letter-spacing: -0.03em;
line-height: 1.1;
}
h2 {
font-size: 2rem !important;
font-weight: 700 !important;
color: var(--text-primary) !important;
margin-top: 3rem !important;
margin-bottom: 0 !important; /* 修正: 1.5remから0に変更 */
position: relative;
padding-left: 1rem;
}
h2::before {
content: "";
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 4px;
height: 70%;
background: var(--gradient-1);
border-radius: 2px;
}
/* テキストスタイル */
p, li {
color: var(--text-secondary);
line-height: 1.8;
font-size: 1rem;
}
strong {
color: var(--text-primary);
font-weight: 600;
}
/* グロウカード */
.glow-card {
background: linear-gradient(135deg, rgba(212, 175, 55, 0.05), rgba(139, 105, 20, 0.03));
backdrop-filter: blur(10px);
border: 1px solid rgba(212, 175, 55, 0.2);
border-radius: 20px;
padding: 2rem;
margin-top: 0.5rem; /* 修正: h2との間隔を狭める */
margin-bottom: 2rem;
position: relative;
overflow: visible;
transition: all 0.3s ease;
min-height: auto;
height: auto;
box-sizing: border-box;
}
.glow-card::before {
content: "";
position: absolute;
top: -2px;
left: -2px;
right: -2px;
bottom: -2px;
background: var(--gradient-1);
border-radius: 20px;
opacity: 0;
z-index: -1;
transition: opacity 0.3s ease;
}
.glow-card:hover::before {
opacity: 0.2;
}
.glow-card:hover {
transform: translateY(-2px);
box-shadow: 0 10px 40px rgba(212, 175, 55, 0.15);
border-color: rgba(212, 175, 55, 0.4);
}
/* ヒーローセクション */
.hero-section {
text-align: center;
padding: 2rem 0 0 0;
position: relative;
}
.hero-subtitle {
font-size: 1.25rem;
color: var(--secondary);
font-weight: 500;
margin-bottom: 1rem;
}
.hero-badges {
display: flex;
gap: 1rem;
justify-content: center;
flex-wrap: wrap;
margin-top: 1.5rem;
margin-bottom: 0;
}
.badge {
background: rgba(212, 175, 55, 0.15);
border: 1px solid rgba(212, 175, 55, 0.3);
padding: 0.5rem 1rem;
border-radius: 999px;
font-size: 0.875rem;
color: var(--secondary);
font-weight: 500;
transition: all 0.2s ease;
}
.badge:hover {
background: rgba(212, 175, 55, 0.25);
transform: scale(1.05);
box-shadow: 0 4px 15px rgba(212, 175, 55, 0.2);
}
/* プロフィール画像 */
.profile-image-container {
text-align: center;
position: relative;
}
.profile-image-wrapper {
position: relative;
width: 200px;
height: 200px;
margin: 0 auto;
display: inline-block;
}
.profile-image-wrapper img {
width: 200px;
height: 200px;
min-width: 200px;
min-height: 200px;
aspect-ratio: 1 / 1;
border-radius: 50%;
object-fit: cover;
object-position: center;
position: relative;
z-index: 2;
transition: transform 0.3s ease;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
display: block;
}
.profile-image-wrapper:hover img {
transform: scale(1.05);
box-shadow: 0 15px 40px rgba(0, 0, 0, 0.6);
}
.image-glow {
position: absolute;
inset: -30px;
border-radius: 50%;
background: radial-gradient(circle, rgba(212, 175, 55, 0.3), transparent);
filter: blur(30px);
opacity: 0.5;
animation: glow-pulse 4s ease-in-out infinite;
z-index: -1;
}
@keyframes glow-pulse {
0%, 100% {
opacity: 0.3;
transform: scale(0.95);
}
50% {
opacity: 0.6;
transform: scale(1.05);
}
}
/* イントロセクション */
.intro-section {
background: linear-gradient(135deg, rgba(212, 175, 55, 0.06), rgba(139, 105, 20, 0.04));
backdrop-filter: blur(10px);
border: 1px solid rgba(212, 175, 55, 0.2);
border-radius: 30px;
padding: 3rem;
margin: 2rem auto;
position: relative;
overflow: hidden;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
}
.intro-section::before {
content: "";
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: radial-gradient(circle, rgba(212, 175, 55, 0.05) 0%, transparent 70%);
animation: rotate 20s linear infinite;
}
@keyframes rotate {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* タイムライン */
.timeline-item {
position: relative;
padding-left: 2rem;
margin-bottom: 2rem;
border-left: 2px solid rgba(212, 175, 55, 0.2);
word-wrap: break-word;
overflow-wrap: break-word;
}
.timeline-item::before {
content: "";
position: absolute;
left: -6px;
top: 0;
width: 10px;
height: 10px;
background: var(--primary);
border-radius: 50%;
box-shadow: 0 0 20px rgba(212, 175, 55, 0.5);
}
.timeline-date {
color: var(--primary);
font-weight: 600;
font-size: 0.875rem;
margin-bottom: 0.5rem;
}
/* リンク */
a {
color: var(--secondary) !important;
text-decoration: none;
position: relative;
transition: color 0.2s ease;
}
a:hover {
color: var(--primary) !important;
}
/* スキルタグ */
.skill-tag {
display: inline-block;
background: rgba(212, 175, 55, 0.1);
border: 1px solid rgba(212, 175, 55, 0.25);
padding: 0.25rem 0.75rem;
border-radius: 999px;
font-size: 0.875rem;
color: var(--secondary);
margin-right: 0.5rem;
margin-bottom: 0.5rem;
transition: all 0.2s ease;
}
.skill-tag:hover {
background: rgba(212, 175, 55, 0.2);
transform: translateY(-2px);
box-shadow: 0 4px 10px rgba(212, 175, 55, 0.15);
}
/* コンタクトボタン */
.contact-button {
background: var(--gradient-1);
color: var(--bg-dark);
padding: 1rem 2rem;
border-radius: 999px;
font-weight: 700;
text-decoration: none;
display: inline-block;
transition: all 0.3s ease;
box-shadow: 0 5px 20px rgba(212, 175, 55, 0.3);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.contact-button:hover {
transform: translateY(-2px);
box-shadow: 0 8px 30px rgba(212, 175, 55, 0.4);
background: var(--gradient-2);
}
/* 言語切り替えボタン */
.lang-button {
background: rgba(212, 175, 55, 0.1);
border: 1px solid rgba(212, 175, 55, 0.3);
color: var(--secondary);
padding: 0.5rem 1rem;
border-radius: 8px;
font-size: 0.875rem;
transition: all 0.2s ease;
cursor: pointer;
}
.lang-button:hover {
background: rgba(212, 175, 55, 0.2);
transform: translateY(-1px);
}
.lang-button.active {
background: var(--gradient-1);
color: var(--bg-dark);
font-weight: 600;
}
/* ブログカード */
.blog-card {
background: rgba(212, 175, 55, 0.05);
border: 1px solid rgba(212, 175, 55, 0.2);
border-radius: 15px;
padding: 1.5rem;
margin-bottom: 1rem;
transition: all 0.3s ease;
}
.blog-card:hover {
transform: translateY(-2px);
box-shadow: 0 5px 20px rgba(212, 175, 55, 0.15);
}
.blog-date {
color: var(--primary);
font-size: 0.875rem;
margin-bottom: 0.5rem;
}
.blog-tags {
margin-top: 0.5rem;
}
/* ソーシャルリンクグリッド */
.social-links-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 1rem;
margin-top: 1rem;
}
.social-link-item {
display: flex;
flex-direction: column;
align-items: center;
padding: 1.5rem;
background: rgba(212, 175, 55, 0.05);
border: 1px solid rgba(212, 175, 55, 0.2);
border-radius: 15px;
transition: all 0.3s ease;
text-decoration: none !important;
}
.social-link-item:hover {
transform: translateY(-3px);
background: rgba(212, 175, 55, 0.15);
box-shadow: 0 5px 20px rgba(212, 175, 55, 0.2);
border-color: var(--primary);
}
.social-link-item i {
font-size: 2rem;
color: var(--primary);
margin-bottom: 0.5rem;
}
.social-link-item span {
color: var(--text-secondary);
font-size: 0.9rem;
font-weight: 500;
}
.social-link-item:hover span {
color: var(--primary);
}
/* フッター非表示 */
footer { visibility: hidden; }
/* レスポンシブ */
@media (max-width: 768px) {
h1 { font-size: 2.5rem !important; }
.glow-card { padding: 1.5rem; }
.profile-image-wrapper,
.profile-image-wrapper img {
width: 150px;
height: 150px;
min-width: 150px;
min-height: 150px;
}
.intro-section {
padding: 2rem 1.5rem;
}
.timeline-item {
padding-left: 1.5rem;
margin-bottom: 1.5rem;
}
}
/* カスタムスクロールバー */
::-webkit-scrollbar {
width: 10px;
}
::-webkit-scrollbar-track {
background: rgba(10, 10, 10, 0.5);
}
::-webkit-scrollbar-thumb {
background: var(--primary);
border-radius: 5px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--primary-dark);
}
</style>
""", unsafe_allow_html=True)
# 画像最適化関数
def optimize_image(image_path, max_size=(800, 800)):
"""画像を最適化して読み込み速度を改善"""
if not os.path.exists(image_path):
return None
try:
img = Image.open(image_path)
img.thumbnail(max_size, Image.Resampling.LANCZOS)
buffer = io.BytesIO()
img.save(buffer, format="PNG", optimize=True)
return base64.b64encode(buffer.getvalue()).decode()
except:
return None
# GitHub統計取得(キャッシュ付き)
@st.cache_data(ttl=3600)
def fetch_github_stats(username="taiseiozaki"): # あなたのGitHubユーザー名に変更
try:
response = requests.get(f"https://api.github.com/users/{username}")
if response.status_code == 200:
data = response.json()
return {
"repos": data.get("public_repos", 0),
"followers": data.get("followers", 0),
"following": data.get("following", 0)
}
except:
pass
return {"repos": 0, "followers": 0, "following": 0}
# メイン関数
def main():
# 言語切り替え
col1, col2, col3 = st.columns([1, 1, 8])
with col1:
if st.button("🇯🇵 日本語", key="ja_btn"):
st.session_state.language = 'ja'
st.rerun()
with col2:
if st.button("🇺🇸 English", key="en_btn"):
st.session_state.language = 'en'
st.rerun()
lang = st.session_state.language
# ヒーローセクション
st.markdown(f"""
<div class="hero-section">
<div class="hero-subtitle">{content[lang]['subtitle']}</div>
<h1>Taisei Ozaki</h1>
<div class="hero-badges">
{"".join([f'<span class="badge">{badge}</span>' for badge in content[lang]['badges']])}
</div>
</div>
""", unsafe_allow_html=True)
# プロフィール画像
st.markdown('<div style="margin-top: -10rem;">', unsafe_allow_html=True)
col1, col2, col3, col4, col5 = st.columns([2.5, 2, 1, 2, 2.5])
with col2:
logo_data = optimize_image('my_logo.jpg')
if logo_data:
st.markdown(f"""
<div class="profile-image-container">
<div class="profile-image-wrapper">
<div class="image-glow"></div>
<img src="data:image/png;base64,{logo_data}" alt="Logo">
</div>
</div>
""", unsafe_allow_html=True)
with col4:
profile_data = optimize_image('profile_pic.jpg')
if profile_data:
st.markdown(f"""
<div class="profile-image-container">
<div class="profile-image-wrapper">
<div class="image-glow"></div>
<img src="data:image/png;base64,{profile_data}" alt="Profile">
</div>
</div>
""", unsafe_allow_html=True)
st.markdown('</div>', unsafe_allow_html=True)
# イントロセクション
st.markdown(f"""
<div class="intro-section" style="text-align: center;">
<p style="font-size: 1.3rem; line-height: 2; color: var(--text-primary); margin: 0; position: relative; z-index: 1;">
{content[lang]['intro']}
</p>
</div>
""", unsafe_allow_html=True)
# メインコンテンツ
col1, col2 = st.columns([2, 3])
with col1:
# 現在の所属
st.markdown(f'<h2>{content[lang]["current_position"]}</h2>', unsafe_allow_html=True)
if lang == 'ja':
st.markdown("""
<div class="glow-card">
<div class="timeline-item">
<div class="timeline-date">2025年4月 - 現在</div>
<strong>大阪公立大学大学院</strong><br>
工学研究科 機械系専攻 博士後期課程
</div>
<div class="timeline-item">
<div class="timeline-date">2025年4月 - 現在</div>
<strong>東京大学 松尾岩澤研究室</strong><br>
学術専門職員
</div>
<div class="timeline-item">
<div class="timeline-date">2025年4月 - 現在</div>
<strong>株式会社 松尾研究所</strong><br>
データサイエンティスト
</div>
</div>
""", unsafe_allow_html=True)
else:
st.markdown("""
<div class="glow-card">
<div class="timeline-item">
<div class="timeline-date">Apr 2025 - Present</div>
<strong>Osaka Metropolitan University</strong><br>
Graduate School of Engineering, Mechanical Engineering, PhD Program
</div>
<div class="timeline-item">
<div class="timeline-date">Apr 2025 - Present</div>
<strong>University of Tokyo, Matsuo-Iwasawa Lab</strong><br>
Academic Research Staff
</div>
<div class="timeline-item">
<div class="timeline-date">Apr 2025 - Present</div>
<strong>Matsuo Institute Inc.</strong><br>
Data Scientist
</div>
</div>
""", unsafe_allow_html=True)
# スキルセクション
st.markdown(f'<h2>{content[lang]["tech_stack"]}</h2>', unsafe_allow_html=True)
if lang == 'ja':
st.markdown("""
<div class="glow-card">
<div style="margin-bottom: 1rem;">
<strong style="color: var(--primary);">AI/ML</strong><br>
<span class="skill-tag">LLM</span>
<span class="skill-tag">NLP</span>
<span class="skill-tag">Deep Learning</span>
<span class="skill-tag">世界モデル</span>
</div>
<div style="margin-bottom: 1rem;">
<strong style="color: var(--primary);">Programming</strong><br>
<span class="skill-tag">Python</span>
<span class="skill-tag">C++</span>
<span class="skill-tag">PyTorch</span>
</div>
<div>
<strong style="color: var(--primary);">Research</strong><br>
<span class="skill-tag">LLM開発</span>
<span class="skill-tag">AIエージェント</span>
<span class="skill-tag">機械工学</span>
</div>
</div>
""", unsafe_allow_html=True)
else:
st.markdown("""
<div class="glow-card">
<div style="margin-bottom: 1rem;">
<strong style="color: var(--primary);">AI/ML</strong><br>
<span class="skill-tag">LLM</span>
<span class="skill-tag">NLP</span>
<span class="skill-tag">Deep Learning</span>
<span class="skill-tag">World Models</span>
</div>
<div style="margin-bottom: 1rem;">
<strong style="color: var(--primary);">Programming</strong><br>
<span class="skill-tag">Python</span>
<span class="skill-tag">C++</span>
<span class="skill-tag">PyTorch</span>
</div>
<div>
<strong style="color: var(--primary);">Research</strong><br>
<span class="skill-tag">LLM Development</span>
<span class="skill-tag">AI Agents</span>
<span class="skill-tag">Mechanical Engineering</span>
</div>
</div>
""", unsafe_allow_html=True)
# SNSリンク集
st.markdown(f'<h2>{content[lang]["social_links"]}</h2>', unsafe_allow_html=True)
st.markdown("""
<div class="glow-card">
<div class="social-links-grid">
<a href="https://x.com/Symonds_DeL" target="_blank" class="social-link-item">
<i class="fab fa-twitter"></i>
<span>Twitter・X</span>
</a>
<a href="https://github.com/DeL-TaiseiOzaki" target="_blank" class="social-link-item">
<i class="fab fa-github"></i>
<span>GitHub</span>
</a>
<a href="https://www.linkedin.com/in/taisei-ozaki-del/" target="_blank" class="social-link-item">
<i class="fab fa-linkedin"></i>
<span>LinkedIn</span>
</a>
<a href="https://scholar.google.com/citations?user=IrxaduIAAAAJ&hl=ja" target="_blank" class="social-link-item">
<i class="fas fa-graduation-cap"></i>
<span>Google Scholar</span>
</a>
<a href="https://huggingface.co/DeL-TaiseiOzaki" target="_blank" class="social-link-item">
<i class="fas fa-robot"></i>
<span>Huggingface</span>
</a>
<a href="https://zenn.dev/delzaky" target="_blank" class="social-link-item">
<i class="fas fa-book"></i>
<span>Zenn</span>
</a>
<a href="https://www.kaggle.com/delthunder" target="_blank" class="social-link-item">
<i class="fas fa-book"></i>
<span>Zenn</span>
</a>
</div>
</div>
""", unsafe_allow_html=True)
with col2:
# 主な実績
st.markdown(f'<h2>{content[lang]["achievements"]}</h2>', unsafe_allow_html=True)
if lang == 'ja':
st.markdown("""
<div class="glow-card">
<div class="timeline-item">
<div class="timeline-date">2025年3月</div>
<strong>大阪公立大学 学長表彰</strong><br>
優れた研究実績が評価され受賞
</div>
<div class="timeline-item">
<div class="timeline-date">2025年3月</div>
<strong>大阪公立大学大学院 工学研究科 学生顕彰</strong><br>
学術研究で優れた成果を挙げた学生に贈られる賞
</div>
<div class="timeline-item">
<div class="timeline-date">2024年6月</div>
<strong>人工知能学会 全国大会 優秀賞</strong><br>
LLMによる前提生成ステップを用いた反論の攻撃力向上手法
</div>
</div>
<div class="timeline-item">
<div class="timeline-date">2024年3月</div>
<strong>大阪公立大学大学院 工学研究科 学生顕彰</strong><br>
学術研究で優れた成果を挙げた学生に贈られる賞
</div>
<div class="timeline-item">
<div class="timeline-date">2023年6月</div>
<strong>人工知能学会 全国大会 優秀賞</strong><br>
大規模言語モデルによる高品質反論文の自動生成
</div>
</div>
""", unsafe_allow_html=True)
else:
st.markdown("""
<div class="glow-card">
<div class="timeline-item">
<div class="timeline-date">Mar 2025</div>
<strong>President Award, Osaka Metropolitan University</strong><br>
Awarded for outstanding research achievements
</div>
<div class="timeline-item">
<div class="timeline-date">Mar 2025</div>
<strong>Graduate School Student Recognition Award</strong><br>
Graduate School of Engineering, Osaka Metropolitan University
</div>
<div class="timeline-item">
<div class="timeline-date">Jun 2024</div>
<strong>JSAI Annual Conference Excellence Award</strong><br>
Method for Enhancing Counterargument Attack Power Using LLM-based Premise Generation
</div>
<div class="timeline-item">
<div class="timeline-date">Jun 2023</div>
<strong>JSAI Annual Conference Excellence Award</strong><br>
Automatic Generation of High-Quality Counterarguments by Large Language Models
</div>
</div>
""", unsafe_allow_html=True)
# 来歴
st.markdown(f'<h2>{content[lang]["career"]}</h2>', unsafe_allow_html=True)
if lang == 'ja':
st.markdown("""
<div class="glow-card">
<div class="timeline-item">
<div class="timeline-date">2025年4月 - 現在</div>
<strong>現所属</strong><br>
「現在の所属」に記載
</div>
<div class="timeline-item">
<div class="timeline-date">2023年4月 - 2025年3月</div>
<strong>大阪公立大学大学院 博士前期課程</strong><br>
工学研究科 機械系専攻
</div>
<div class="timeline-item">
<div class="timeline-date">2019年4月 - 2023年3月</div>
<strong>大阪府立大学</strong><br>
工学域 機械系学類
</div>
<div class="timeline-item">
<div class="timeline-date">2018年8月 - 現在</div>
<strong>個人事業主</strong><br>
---------
</div>
</div>
""", unsafe_allow_html=True)
else:
st.markdown("""
<div class="glow-card">
<div class="timeline-item">
<div class="timeline-date">Apr 2025 - Present</div>
<strong>Current Affiliations</strong><br>
Listed in "Current Affiliations" section
</div>
<div class="timeline-item">
<div class="timeline-date">Apr 2023 - Mar 2025</div>
<strong>Osaka Metropolitan University, Master Program</strong><br>
Graduate School of Engineering, Mechanical Engineering
</div>
<div class="timeline-item">
<div class="timeline-date">Apr 2019 - Mar 2023</div>
<strong>Osaka Prefecture University</strong><br>
School of Engineering, Mechanical Engineering
</div>
<div class="timeline-item">
<div class="timeline-date">Aug 2018 - Present</div>
<strong>Freelancer/Self-employed</strong><br>
---------
</div>
</div>
""", unsafe_allow_html=True)
# 研究発表(詳細付き)
st.markdown(f'<h2>{content[lang]["publications"]}</h2>', unsafe_allow_html=True)
if lang == 'ja':
publications = [
{
'id': 'pub1',
'date': '2025年6月',
'title': 'JDERW:世界モデルを要する推論問題に関する日本語LLMベンチマーク',
'venue': '人工知能学会第39回全国大会',
'authors': 'Taisei Ozaki, Chihiro Nakagawa, Naoya Inoue, Shoichi Naito, Kenshi Yamaguchi',
'abstract': '世界理解能力を要する演繹的推論ベンチマークデータセットJDERWを提案した。日本語LLMの世界モデル理解能力を定量的に評価するための包括的なベンチマークを構築し、既存モデルの性能分析を行った。'
},
{
'id': 'pub2',
'date': '2025年6月',
'title': 'LLMによる運動方程式導出のための評価データセット構築',
'venue': '人工知能学会第39回全国大会',
'authors': '中村健二, 中川智皓, 尾崎大晟, 新谷篤彦',
'abstract': 'LLMの運動方程式理解力を定量化するため、公開WEBや書籍から画像と対応する運動方程式を収録したQAベンチマークデータセットを構築し、評価実験で一部の課題で正確な導出が確認された。'
},
{
'id': 'pub3',
'date': '2025年4月',
'title': 'LLM DEBATE OPPONENT: Counter-argument Generation focusing on Implicit and Critical Premises',
'venue': 'NAACL 2025 Student Research Workshop',
'authors': 'Taisei Ozaki, Chihiro Nakagawa, Naoya Inoue, Shoichi Naito, Kenshi Yamaguchi',
'abstract': 'ディベート教育は批判的思考スキルを育成するが、しばしば高い人的コストを伴う。LLMによる反駁生成の自動化において、暗黙的・批判的前提をどのように標的にするかが課題となっている。本研究では、100のディベートトピックにおいて多段階と一段階の生成手法を体系的に比較し、一段階アプローチが一貫して優れた性能を示すことを明らかにした。'
},
{
'id': 'pub4',
'date': '2025年3月',
'title': 'LLM as a Debate Judge: 学習者ディベーターへの自動フィードバック生成',
'venue': '言語処理学会第31回年次大会',
'authors': '天野祥太朗, 新谷篤彦, 尾崎大晟, 中川智皓, 井之上直也, 内藤昭一, 山口健史',
'abstract': 'ディベート学習支援のためのLLMベース自動フィードバックシステムを提案。学習者のディベート技能向上を支援するための包括的なフィードバック生成手法について検討した。'
},
{
'id': 'pub5',
'date': '2024年6月',
'title': 'LLMによる前提生成ステップを用いた反論の攻撃力向上手法',
'venue': '人工知能学会全国大会第38回(優秀賞受賞)',
'authors': '尾﨑大晟, 中川智皓, 内藤昭一, 井之上直也, 山口健史, 天野祥太郎',
'abstract': 'LLMによる前提生成ステップを導入することで、反論の攻撃力を向上させる新たな手法を提案。従来手法と比較して有意な性能向上を実現した。'
},
{
'id': 'pub6',
'date': '2024年3月',
'title': '大規模言語モデルを用いた有効反論箇所としての前提生成',
'venue': '言語処理学会第30回年次大会',
'authors': '新谷篤彦, 尾崎大晟, 中川智皓, 井之上直也, 内藤昭一, 山口健史, 天野祥太朗',
'abstract': '大規模言語モデルを用いて有効な反論箇所としての前提を生成する手法を提案。反論の質の向上に寄与する重要な前提の特定と生成について検討した。'
},
{
'id': 'pub7',
'date': '2024年5月',
'title': '異常検知モデルを用いた電動キックボード乗車時のドライバの障害物への気付きの推定',
'venue': 'ロボティクス・メカトロニクス講演会2024',
'authors': '坪本颯史, 中川智皓, 尾崎大晟, 新谷篤彦, 松井雄吾',
'abstract': '電動キックボード乗車時における安全性向上のため、異常検知モデルを用いてドライバの障害物への気付きを推定する手法を開発。実際の走行データを用いた検証を行った。'
},
{
'id': 'pub8',
'date': '2024年6月',
'title': '大規模言語モデルの生成反論文のテンプレート追従性',
'venue': '人工知能学会全国大会第38回',
'authors': '天野祥太朗, 中川智皓, 内藤昭一, 井之上直也, 山口健史, 尾崎大晟, 新谷篤彦',
'abstract': '大規模言語モデルが生成する反論文のテンプレート追従性について分析。ディベート教育における構造化された反論文生成の有効性を検証した。'
},
{
'id': 'pub9',
'date': '2023年6月',
'title': '大規模言語モデルによる高品質反論文の自動生成',
'venue': '人工知能学会全国大会第37回(優秀賞受賞)',
'authors': '尾崎大晟, 中川智皓, 内藤昭一, 井之上直也, 山口健史, 新谷篤彦',
'abstract': '大規模言語モデルを用いて高品質な反論文を自動生成する手法を提案。ディベート教育における実用的な応用可能性を示した。'
}
]
else:
publications = [
{
'id': 'pub1',
'date': 'June 2025',
'title': 'JDERW: Japanese LLM Benchmark for Reasoning Problems Requiring World Models',
'venue': 'The 39th JSAI Annual Conference',
'authors': 'Taisei Ozaki, Chihiro Nakagawa, Naoya Inoue, Shoichi Naito, Kenshi Yamaguchi',
'abstract': 'We proposed JDERW, a deductive reasoning benchmark dataset requiring world understanding capabilities. This comprehensive benchmark quantitatively evaluates the world model understanding abilities of Japanese LLMs and analyzes the performance of existing models.'
},
{
'id': 'pub2',
'date': 'June 2025',
'title': 'Construction of Evaluation Dataset for Derivation of Equations of Motion by LLMs',
'venue': 'The 39th JSAI Annual Conference',
'authors': 'Kenji Nakamura, Chihiro Nakagawa, Taisei Ozaki, Atsuhiko Shintani',
'abstract': 'To quantify LLMs\' understanding of equations of motion, we constructed a QA benchmark dataset containing images and corresponding equations of motion from public websites and books, with evaluation experiments confirming accurate derivation for some tasks.'
},
{
'id': 'pub3',
'date': 'April 2025',
'title': 'LLM DEBATE OPPONENT: Counter-argument Generation focusing on Implicit and Critical Premises',
'venue': 'NAACL 2025 Student Research Workshop',
'authors': 'Taisei Ozaki, Chihiro Nakagawa, Naoya Inoue, Shoichi Naito, Kenshi Yamaguchi',
'abstract': 'Debate education fosters critical thinking skills but often incurs high human costs. We systematically compare multi-step and one-step generation methods for counter-arguments across 100 debate topics, finding that one-step approaches consistently outperform multi-step pipelines due to better grasp of motion spirit and minimized hallucination propagation.'
},
{
'id': 'pub4',
'date': 'March 2025',
'title': 'LLM as a Debate Judge: Automatic Feedback Generation for Student Debaters',
'venue': 'The 31st Annual Meeting of the Association for Natural Language Processing',
'authors': 'Shotaro Amano, Atsuhiko Shintani, Taisei Ozaki, Chihiro Nakagawa, Naoya Inoue, Shoichi Naito, Kenshi Yamaguchi',
'abstract': 'We propose an LLM-based automatic feedback system for debate learning support. This comprehensive feedback generation method assists learners in improving their debate skills.'
},
{
'id': 'pub5',
'date': 'June 2024',
'title': 'Method for Enhancing Counterargument Attack Power Using LLM-based Premise Generation',
'venue': 'The 38th JSAI Annual Conference (Excellence Award)',
'authors': 'Taisei Ozaki, Chihiro Nakagawa, Shoichi Naito, Naoya Inoue, Kenshi Yamaguchi, Shotaro Amano',
'abstract': 'We propose a novel method to enhance counterargument attack power by introducing LLM-based premise generation steps, achieving significant performance improvements compared to conventional methods.'
},
{
'id': 'pub6',
'date': 'March 2024',
'title': 'Premise Generation as Effective Counterargument Points Using Large Language Models',
'venue': 'The 30th Annual Meeting of the Association for Natural Language Processing',
'authors': 'Atsuhiko Shintani, Taisei Ozaki, Chihiro Nakagawa, Naoya Inoue, Shoichi Naito, Kenshi Yamaguchi, Shotaro Amano',
'abstract': 'We propose a method for generating premises as effective counterargument points using large language models, contributing to improved quality of counterarguments through identification and generation of important premises.'
},
{
'id': 'pub7',
'date': 'May 2024',
'title': 'Estimation of Driver Awareness of Obstacles When Riding Electric Kick Scooters Using Anomaly Detection Models',
'venue': 'Robotics and Mechatronics Conference 2024',
'authors': 'Soshi Tsubomoto, Chihiro Nakagawa, Taisei Ozaki, Atsuhiko Shintani, Yugo Matsui',
'abstract': 'We developed a method to estimate driver awareness of obstacles when riding electric kick scooters using anomaly detection models to improve safety, validated using actual driving data.'
},
{
'id': 'pub8',
'date': 'June 2024',
'title': 'Template Adherence of Large Language Model-Generated Counterarguments',
'venue': 'The 38th JSAI Annual Conference',
'authors': 'Shotaro Amano, Chihiro Nakagawa, Shoichi Naito, Naoya Inoue, Kenshi Yamaguchi, Taisei Ozaki, Atsuhiko Shintani',
'abstract': 'We analyzed the template adherence of counterarguments generated by large language models, validating the effectiveness of structured counterargument generation in debate education.'
},
{
'id': 'pub9',
'date': 'June 2023',
'title': 'Automatic Generation of High-Quality Counterarguments by Large Language Models',
'venue': 'The 37th JSAI Annual Conference (Excellence Award)',
'authors': 'Taisei Ozaki, Chihiro Nakagawa, Shoichi Naito, Naoya Inoue, Kenshi Yamaguchi, Atsuhiko Shintani',
'abstract': 'We propose a method for automatically generating high-quality counterarguments using large language models, demonstrating practical applicability in debate education.'
}
]
for pub in publications:
with st.expander(f"📄 {pub['title']}", expanded=False):
st.markdown(f"""
<div style="margin-bottom: 1rem;">
<span class="timeline-date">{pub['date']}</span> |
<span style="color: var(--text-secondary);">{pub['venue']}</span>
</div>
<div style="margin-bottom: 1rem;">
<strong style="color: var(--primary);">{"著者" if lang == 'ja' else "Authors"}:</strong><br>
<span style="color: var(--text-secondary);">{pub['authors']}</span>
</div>
<p>{pub['abstract']}</p>
""", unsafe_allow_html=True)
# プロジェクト
st.markdown(f'<h2>{content[lang]["projects"]}</h2>', unsafe_allow_html=True)
col1, col2 = st.columns(2)
with col1:
if lang == 'ja':
st.markdown("""
<div class="glow-card">
<h3 style="color: var(--primary); font-size: 1.3rem;">経産省 AKATSUKIプロジェクト</h3>
<p>革新的なアイデアを持つ若手テック人材を応援するプログラムで関西地域代表として採択</p>
</div>
""", unsafe_allow_html=True)
else:
st.markdown("""
<div class="glow-card">
<h3 style="color: var(--primary); font-size: 1.3rem;">METI AKATSUKI Project</h3>
<p>Selected as Kansai regional representative in a program supporting young tech talents with innovative ideas</p>
</div>
""", unsafe_allow_html=True)
with col2:
if lang == 'ja':
st.markdown("""
<div class="glow-card">
<h3 style="color: var(--primary); font-size: 1.3rem;">NEDO Geniac プロジェクト</h3>
<p>東京大学松尾研究所の大規模言語モデル開発プロジェクトでチームリーダーを務める</p>
</div>
""", unsafe_allow_html=True)
else:
st.markdown("""
<div class="glow-card">
<h3 style="color: var(--primary); font-size: 1.3rem;">NEDO Geniac Project</h3>
<p>Serving as team leader in the large language model development project at University of Tokyo Matsuo Institute</p>
</div>
""", unsafe_allow_html=True)
# コンタクト
st.markdown(f'<h2>{content[lang]["contact"]}</h2>', unsafe_allow_html=True)
col1, col2, col3 = st.columns([1, 2, 1])
with col2:
st.markdown(f"""
<div class="glow-card" style="text-align: center;">
<p style="margin-bottom: 2rem;">
{content[lang]['contact_intro']}
</p>
<div style="margin-bottom: 1rem;">
<strong>{"大阪公立大学" if lang == 'ja' else "Osaka Metropolitan University"}</strong><br>
<a href="mailto:[email protected]">[email protected]</a>
</div>
<div style="margin-bottom: 1rem;">
<strong>{"松尾研究所" if lang == 'ja' else "Matsuo Institute"}</strong><br>
<a href="mailto:[email protected]">[email protected]</a>
</div>
<div style="margin-bottom: 1rem;">
<strong>{"東京大学" if lang == 'ja' else "The University of Tokyo"}</strong><br>
<a href="mailto:[email protected]">[email protected]</a>
</div>
<div style="margin-bottom: 1rem;">
<strong>{"個人" if lang == 'ja' else "Personal"}</strong><br>
<a href="mailto:[email protected]">[email protected]</a>
</div>
</div>
""", unsafe_allow_html=True)
# アニメーション効果のJavaScript
st.markdown("""
<script>
// スムーズスクロール効果
document.addEventListener("DOMContentLoaded", function() {
const cards = document.querySelectorAll(".glow-card");
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = "1";
entry.target.style.transform = "translateY(0)";
}
});
});
cards.forEach(card => {
card.style.opacity = "0";
card.style.transform = "translateY(20px)";
card.style.transition = "all 0.6s ease-out";
observer.observe(card);
});
});
</script>
""", unsafe_allow_html=True)
if __name__ == "__main__":
try:
main()
except Exception as e:
st.error(f"An error occurred: {str(e)}")