feat: 集成DeepSeek照片建议生成器

- 新增DeepSeek照片建议生成器模块
- 在照片质量评分和美学评分中集成DeepSeek智能建议
- 支持个性化改进建议、美学指导和综合评估
- 添加DeepSeek配置状态显示和错误处理机制
This commit is contained in:
AI Developer 2026-01-09 08:48:13 +08:00
parent 7b3cbb2324
commit 38bac0e110
2 changed files with 433 additions and 0 deletions

120
app.py
View File

@ -184,6 +184,20 @@ elif page == "📸 AI照片评分":
else:
st.warning(f"⚠️ AI文案生成: {copywriter_message}")
# DeepSeek照片建议状态检查
try:
from utils.deepseek_photo_advisor import check_deepseek_config
deepseek_available, deepseek_message = check_deepseek_config()
except:
deepseek_available = False
deepseek_message = "DeepSeek照片建议生成器未配置"
# 显示DeepSeek状态
if deepseek_available:
st.success("✅ DeepSeek照片建议生成器可用")
else:
st.warning(f"⚠️ DeepSeek照片建议: {deepseek_message}")
col1, col2, col3, col4 = st.columns(4)
with col1:
@ -243,6 +257,58 @@ elif page == "📸 AI照片评分":
for i, suggestion in enumerate(suggestions[:3], 1):
st.write(f"{i}. {suggestion}")
# DeepSeek智能建议如果可用
if deepseek_available:
st.subheader("🤖 DeepSeek智能建议")
with st.spinner("正在生成个性化改进建议..."):
try:
from utils.deepseek_photo_advisor import get_deepseek_quality_advice
# 获取照片内容描述用于个性化建议
from utils.baidu_image_analysis import analyze_image_content
content_result = analyze_image_content(file_path)
photo_description = content_result.get('summary', '一张照片')
deepseek_advice = get_deepseek_quality_advice(quality_scores, photo_description)
if deepseek_advice:
# 显示DeepSeek总体评价
if deepseek_advice.get('overall_evaluation'):
st.info(f"**总体评价**: {deepseek_advice['overall_evaluation']}")
# 显示优势分析
if deepseek_advice.get('strengths'):
st.subheader("🌟 优势分析")
for strength in deepseek_advice['strengths']:
st.success(f"{strength}")
# 显示优先级改进
if deepseek_advice.get('priority_improvements'):
st.subheader("🎯 重点改进领域")
for improvement in deepseek_advice['priority_improvements']:
st.warning(f"⚠️ {improvement}")
# 显示具体建议
if deepseek_advice.get('specific_advice'):
st.subheader("🔧 个性化改进建议")
for dimension, suggestions in deepseek_advice['specific_advice'].items():
with st.expander(f"{dimension}详细建议"):
for i, suggestion in enumerate(suggestions, 1):
st.write(f"{i}. {suggestion}")
# 显示学习资源
if deepseek_advice.get('learning_resources'):
st.subheader("📚 推荐学习资源")
for resource in deepseek_advice['learning_resources']:
st.info(f"📖 {resource}")
st.success("DeepSeek智能建议生成完成")
else:
st.info("DeepSeek建议生成失败已显示基础建议")
except Exception as e:
st.warning(f"DeepSeek建议生成失败: {str(e)}")
st.success("照片质量分析完成!已生成详细改进建议")
except Exception as e:
st.error(f"质量评分失败: {str(e)}")
@ -352,6 +418,60 @@ elif page == "📸 AI照片评分":
for i, suggestion in enumerate(suggestions, 1):
st.write(f"{i}. {suggestion}")
# DeepSeek智能美学建议如果可用
if deepseek_available:
st.subheader("🤖 DeepSeek美学指导")
with st.spinner("正在生成专业美学建议..."):
try:
from utils.deepseek_photo_advisor import get_deepseek_aesthetic_advice
# 准备美学评分数据
aesthetic_scores = {
'overall_score': aesthetic_score,
'composition': aesthetic_result['composition'],
'color_harmony': aesthetic_result['color_harmony'],
'lighting': aesthetic_result['lighting'],
'focus': aesthetic_result['focus']
}
deepseek_aesthetic_advice = get_deepseek_aesthetic_advice(aesthetic_scores, photo_content)
if deepseek_aesthetic_advice:
# 显示美学评价
if deepseek_aesthetic_advice.get('aesthetic_evaluation'):
st.info(f"**美学评价**: {deepseek_aesthetic_advice['aesthetic_evaluation']}")
# 显示构图建议
if deepseek_aesthetic_advice.get('composition_advice'):
st.subheader("🎨 构图艺术指导")
for advice in deepseek_aesthetic_advice['composition_advice']:
st.success(f"📐 {advice}")
# 显示色彩建议
if deepseek_aesthetic_advice.get('color_advice'):
st.subheader("🌈 色彩运用建议")
for advice in deepseek_aesthetic_advice['color_advice']:
st.info(f"🎨 {advice}")
# 显示光线建议
if deepseek_aesthetic_advice.get('lighting_advice'):
st.subheader("💡 光影艺术指导")
for advice in deepseek_aesthetic_advice['lighting_advice']:
st.warning(f"{advice}")
# 显示创意建议
if deepseek_aesthetic_advice.get('creative_suggestions'):
st.subheader("🌟 创意提升建议")
for suggestion in deepseek_aesthetic_advice['creative_suggestions']:
st.success(f"💫 {suggestion}")
st.success("DeepSeek美学指导生成完成")
else:
st.info("DeepSeek美学建议生成失败已显示基础建议")
except Exception as e:
st.warning(f"DeepSeek美学建议生成失败: {str(e)}")
st.success("照片美学评估完成!已生成详细改进建议")
except Exception as e:
st.error(f"美学评分失败: {str(e)}")

View File

@ -0,0 +1,313 @@
#!/usr/bin/env python3
"""
DeepSeek照片建议生成器
使用DeepSeek大模型为照片评分结果生成具体个性化的改进建议
"""
import os
import json
import requests
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
class DeepSeekPhotoAdvisor:
"""DeepSeek照片建议生成器类"""
def __init__(self):
"""初始化DeepSeek客户端"""
self.api_key = os.getenv('DEEPSEEK_API_KEY')
if not self.api_key:
raise Exception("DeepSeek API密钥未配置请在.env文件中设置DEEPSEEK_API_KEY")
self.base_url = "https://api.deepseek.com/v1/chat/completions"
def generate_quality_advice(self, quality_scores, photo_description=""):
"""
生成照片质量改进建议
Args:
quality_scores: 质量评分字典包含各维度分数
photo_description: 照片内容描述
Returns:
dict: 包含详细建议的字典
"""
try:
# 构建提示词
prompt = self._build_quality_advice_prompt(quality_scores, photo_description)
# 调用DeepSeek API
response = self._call_deepseek_api(prompt)
# 解析响应
advice_data = self._parse_advice_response(response)
return advice_data
except Exception as e:
# 如果API调用失败返回备用建议
return self._generate_fallback_quality_advice(quality_scores)
def generate_aesthetic_advice(self, aesthetic_scores, photo_description=""):
"""
生成照片美学改进建议
Args:
aesthetic_scores: 美学评分字典
photo_description: 照片内容描述
Returns:
dict: 包含详细美学建议的字典
"""
try:
prompt = self._build_aesthetic_advice_prompt(aesthetic_scores, photo_description)
response = self._call_deepseek_api(prompt)
advice_data = self._parse_advice_response(response)
return advice_data
except Exception as e:
return self._generate_fallback_aesthetic_advice(aesthetic_scores)
def generate_comprehensive_advice(self, quality_scores, aesthetic_scores, photo_description):
"""
生成综合改进建议
Args:
quality_scores: 质量评分
aesthetic_scores: 美学评分
photo_description: 照片描述
Returns:
dict: 综合建议
"""
try:
prompt = self._build_comprehensive_prompt(quality_scores, aesthetic_scores, photo_description)
response = self._call_deepseek_api(prompt)
advice_data = self._parse_advice_response(response)
return advice_data
except Exception as e:
return self._generate_fallback_comprehensive_advice(quality_scores, aesthetic_scores)
def _build_quality_advice_prompt(self, quality_scores, photo_description):
"""构建质量建议提示词"""
prompt = f"""
你是一名专业的摄影指导专家请根据以下照片质量评分结果为摄影师提供具体可操作的改进建议
照片描述{photo_description if photo_description else "未提供具体描述"}
质量评分结果
{json.dumps(quality_scores, indent=2, ensure_ascii=False)}
请按照以下结构提供建议
1. 总体评价简要总结照片质量状况
2. 优势分析指出表现较好的方面
3. 改进重点按优先级列出需要改进的维度
4. 具体建议为每个需要改进的维度提供3-5条具体可操作的建议
5. 学习资源推荐相关学习内容
请用JSON格式返回结构如下
{{
"overall_evaluation": "总体评价",
"strengths": ["优势1", "优势2"],
"priority_improvements": ["优先级1", "优先级2"],
"specific_advice": {{
"维度名称": ["建议1", "建议2", "建议3"]
}},
"learning_resources": ["资源1", "资源2"]
}}
请确保建议具体实用适合摄影爱好者理解
"""
return prompt.strip()
def _build_aesthetic_advice_prompt(self, aesthetic_scores, photo_description):
"""构建美学建议提示词"""
prompt = f"""
你是一名专业的摄影美学指导专家请根据以下照片美学评分结果为摄影师提供具体的美学改进建议
照片描述{photo_description if photo_description else "未提供具体描述"}
美学评分结果
{json.dumps(aesthetic_scores, indent=2, ensure_ascii=False)}
请按照以下结构提供建议
1. 美学评价从艺术角度评价照片
2. 构图建议针对构图提供具体改进方案
3. 色彩建议针对色彩和谐度提供建议
4. 光线建议针对光线运用提供指导
5. 创意提升提供创意性建议
请用JSON格式返回结构如下
{{
"aesthetic_evaluation": "美学评价",
"composition_advice": ["构图建议1", "构图建议2"],
"color_advice": ["色彩建议1", "色彩建议2"],
"lighting_advice": ["光线建议1", "光线建议2"],
"creative_suggestions": ["创意建议1", "创意建议2"]
}}
请确保建议具有艺术性和实用性
"""
return prompt.strip()
def _build_comprehensive_prompt(self, quality_scores, aesthetic_scores, photo_description):
"""构建综合建议提示词"""
prompt = f"""
你是一名资深的摄影导师请根据以下照片的全面评估结果为摄影师提供综合性的改进建议和学习计划
照片描述{photo_description}
质量评分
{json.dumps(quality_scores, indent=2, ensure_ascii=False)}
美学评分
{json.dumps(aesthetic_scores, indent=2, ensure_ascii=False)}
请提供
1. 综合评估结合技术和艺术角度全面评价
2. 个性化学习计划根据评分结果制定针对性学习路径
3. 短期目标可立即实施的改进措施
4. 长期规划提升摄影水平的长期建议
5. 练习建议具体的拍摄练习方案
请用JSON格式返回结构如下
{{
"comprehensive_evaluation": "综合评估",
"learning_plan": {{
"short_term": ["短期目标1", "短期目标2"],
"long_term": ["长期规划1", "长期规划2"]
}},
"practice_suggestions": ["练习建议1", "练习建议2"],
"immediate_actions": ["立即行动1", "立即行动2"]
}}
请确保建议系统实用适合不同水平的摄影爱好者
"""
return prompt.strip()
def _call_deepseek_api(self, prompt):
"""调用DeepSeek API"""
headers = {
'Authorization': f'Bearer {self.api_key}',
'Content-Type': 'application/json'
}
data = {
'model': 'deepseek-chat',
'messages': [
{
'role': 'system',
'content': '你是一名专业的摄影指导专家,具有丰富的摄影教学经验和艺术审美能力。你擅长为不同水平的摄影爱好者提供具体、实用的改进建议。'
},
{
'role': 'user',
'content': prompt
}
],
'max_tokens': 1500,
'temperature': 0.7,
'top_p': 0.9
}
response = requests.post(self.base_url, headers=headers, json=data, timeout=30)
response.raise_for_status()
return response.json()
def _parse_advice_response(self, api_response):
"""解析API响应"""
try:
if 'choices' in api_response and len(api_response['choices']) > 0:
content = api_response['choices'][0]['message']['content'].strip()
# 尝试解析JSON格式的响应
try:
# 提取JSON部分可能包含在代码块中
if '```json' in content:
json_str = content.split('```json')[1].split('```')[0].strip()
elif '```' in content:
json_str = content.split('```')[1].strip()
else:
json_str = content
advice_data = json.loads(json_str)
return advice_data
except json.JSONDecodeError:
# 如果不是JSON格式返回原始文本
return {'raw_advice': content}
else:
raise Exception("API响应格式错误")
except Exception as e:
raise Exception(f"解析API响应失败: {str(e)}")
def _generate_fallback_quality_advice(self, quality_scores):
"""生成备用质量建议"""
return {
"overall_evaluation": "基于评分结果生成的改进建议",
"strengths": ["照片基础质量良好"],
"priority_improvements": ["根据评分结果确定重点改进维度"],
"specific_advice": {
"通用建议": [
"建议使用三脚架提高稳定性",
"注意光线条件,避免过暗或过亮",
"后期适当调整对比度和色彩平衡"
]
},
"learning_resources": ["推荐学习基础摄影知识和后期处理技巧"]
}
def _generate_fallback_aesthetic_advice(self, aesthetic_scores):
"""生成备用美学建议"""
return {
"aesthetic_evaluation": "照片具有基本的审美价值",
"composition_advice": ["学习三分法则构图", "注意主体位置安排"],
"color_advice": ["保持色彩和谐", "避免过度饱和"],
"lighting_advice": ["选择合适的光线条件", "注意光影效果"],
"creative_suggestions": ["尝试不同的拍摄角度", "探索创意构图方式"]
}
def _generate_fallback_comprehensive_advice(self, quality_scores, aesthetic_scores):
"""生成备用综合建议"""
return {
"comprehensive_evaluation": "照片整体表现良好,有提升空间",
"learning_plan": {
"short_term": ["重点改进技术基础", "练习基本构图技巧"],
"long_term": ["系统学习摄影理论", "培养艺术审美能力"]
},
"practice_suggestions": ["多拍多练", "分析优秀作品"],
"immediate_actions": ["检查相机设置", "注意拍摄环境"]
}
# 便捷函数
def get_deepseek_quality_advice(quality_scores, photo_description=""):
"""获取DeepSeek质量建议便捷函数"""
try:
advisor = DeepSeekPhotoAdvisor()
return advisor.generate_quality_advice(quality_scores, photo_description)
except Exception as e:
# 如果DeepSeek不可用返回空建议
return {}
def get_deepseek_aesthetic_advice(aesthetic_scores, photo_description=""):
"""获取DeepSeek美学建议便捷函数"""
try:
advisor = DeepSeekPhotoAdvisor()
return advisor.generate_aesthetic_advice(aesthetic_scores, photo_description)
except Exception as e:
return {}
def check_deepseek_config():
"""检查DeepSeek配置状态"""
try:
api_key = os.getenv('DEEPSEEK_API_KEY')
if api_key:
return True, "DeepSeek照片建议生成器已配置"
else:
return False, "DeepSeek API密钥未配置请在.env文件中设置DEEPSEEK_API_KEY"
except Exception as e:
return False, f"DeepSeek配置检查失败: {str(e)}"