GH/utils/deepseek_copywriter.py

309 lines
12 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""
DeepSeek大模型文案生成服务集成
使用DeepSeek AI大模型为照片生成创意文案
支持多种文案风格和用途
"""
import os
import json
import requests
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
class DeepSeekCopywriter:
"""DeepSeek大模型文案生成服务类"""
def __init__(self, api_key=None):
"""初始化DeepSeek大模型客户端"""
self.api_key = api_key or os.getenv('DEEPSEEK_API_KEY')
self.base_url = "https://api.deepseek.com/v1/chat/completions"
if not self.api_key:
raise Exception("DeepSeek API密钥未配置请在.env文件中设置DEEPSEEK_API_KEY")
def generate_photo_caption(self, image_description, style='creative', length='medium'):
"""为照片生成文案"""
try:
prompt = self._build_prompt(image_description, style, length)
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': 500,
'temperature': 0.8,
'top_p': 0.9
}
response = requests.post(self.base_url, headers=headers, json=data)
result = response.json()
if 'choices' in result and len(result['choices']) > 0:
caption = result['choices'][0]['message']['content'].strip()
# 清理可能的格式标记
caption = caption.replace('"', '').replace('\n', ' ').strip()
return caption
else:
# 如果API调用失败使用备用文案生成
return self._generate_fallback_caption(image_description, style, length)
except Exception as e:
# API调用失败时使用备用方案
return self._generate_fallback_caption(image_description, style, length)
def _build_prompt(self, image_description, style, length):
"""构建DeepSeek大模型提示词"""
style_descriptions = {
'creative': '富有诗意和想象力的创意文艺风格,使用优美的修辞和意象',
'professional': '专业正式的商务风格,简洁明了,注重专业性和可信度',
'social': '活泼有趣的社交媒体风格,适合朋友圈分享,具有互动性',
'marketing': '吸引眼球的营销推广风格,具有说服力,促进转化',
'emotional': '温暖感人的情感表达风格,注重情感共鸣和人文关怀',
'simple': '简单直接的描述风格,清晰明了,易于理解'
}
length_descriptions = {
'short': '10-20字简洁精炼突出重点',
'medium': '30-50字适中长度内容完整',
'long': '80-120字详细描述富有细节'
}
prompt = f"""
请为以下照片内容生成{style_descriptions.get(style, '创意')}的文案要求{length_descriptions.get(length, '适中长度')}
照片内容描述{image_description}
文案创作要求
1. 风格{style_descriptions.get(style, '创意')}
2. 长度{length_descriptions.get(length, '适中长度')}
3. 创意性富有创意避免陈词滥调
4. 吸引力能够吸引目标受众的注意力
5. 情感表达根据风格适当表达情感
6. 适用场景适合社交媒体分享或商业用途
请直接输出文案内容不要添加任何额外的说明或标记文案应该是一个完整的可以直接使用的文本
"""
return prompt.strip()
def generate_multiple_captions(self, image_description, count=3, style='creative'):
"""生成多个文案选项"""
try:
captions = []
# 使用不同的提示词变体生成多个文案
prompt_variants = [
f"请为'{image_description}'照片创作一个{style}风格的文案,要求新颖独特",
f"基于照片内容'{image_description}',写一个{style}风格的创意文案",
f"为这张'{image_description}'的照片设计一个{style}风格的吸引人文案"
]
for i in range(min(count, len(prompt_variants))):
prompt = prompt_variants[i]
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': 200,
'temperature': 0.9, # 提高温度增加多样性
'top_p': 0.95
}
response = requests.post(self.base_url, headers=headers, json=data)
result = response.json()
if 'choices' in result and len(result['choices']) > 0:
caption = result['choices'][0]['message']['content'].strip()
caption = caption.replace('"', '').replace('\n', ' ').strip()
captions.append({
'option': i + 1,
'caption': caption,
'style': style,
'char_count': len(caption)
})
return captions
except Exception as e:
raise Exception(f"生成多个文案失败: {str(e)}")
def analyze_photo_suitability(self, image_description):
"""分析照片适合的文案风格"""
try:
prompt = f"""
请分析以下照片内容最适合的文案风格
照片内容{image_description}
请从以下风格中选择最适合的3个并按适合度排序
1. 创意文艺 - 富有诗意和想象力
2. 专业正式 - 简洁专业
3. 社交媒体 - 活泼有趣
4. 营销推广 - 吸引眼球
5. 情感表达 - 温暖感人
6. 简单描述 - 直接明了
请直接返回风格名称列表用逗号分隔例如"社交媒体,创意文艺,情感表达"
"""
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': 100,
'temperature': 0.3 # 降低温度增加确定性
}
response = requests.post(self.base_url, headers=headers, json=data)
result = response.json()
if 'choices' in result and len(result['choices']) > 0:
analysis = result['choices'][0]['message']['content'].strip()
# 解析返回的风格列表
styles = [s.strip() for s in analysis.split(',')]
return {
'recommended_styles': styles[:3],
'most_suitable': styles[0] if styles else 'creative',
'analysis': analysis
}
else:
return self._fallback_suitability_analysis()
except Exception as e:
return self._fallback_suitability_analysis()
def _generate_fallback_caption(self, image_description, style, length):
"""备用文案生成当DeepSeek服务不可用时"""
# 基于照片描述的简单文案生成
base_captions = {
'creative': [
f"{image_description}的瞬间,时光静静流淌",
f"捕捉{image_description}的诗意,定格永恒美好",
f"{image_description}的艺术之美,值得细细品味"
],
'social': [
f"分享一张{image_description}的美照,希望大家喜欢!",
f"今天遇到的{image_description}太棒了,必须分享!",
f"{image_description}的精彩瞬间,与大家共赏"
],
'professional': [
f"专业拍摄:{image_description}的精彩呈现",
f"{image_description}的专业影像记录",
f"高品质{image_description}摄影作品"
],
'marketing': [
f"惊艳!这个{image_description}你一定要看看!",
f"不容错过的{image_description}精彩瞬间",
f"{image_description}的魅力,等你来发现"
],
'emotional': [
f"{image_description}的温暖瞬间,触动心灵",
f"{image_description}中感受生活的美好",
f"{image_description}的情感表达,真挚动人"
]
}
import random
captions = base_captions.get(style, base_captions['creative'])
caption = random.choice(captions)
# 根据长度调整
if length == 'long' and len(caption) < 50:
caption += "。这张照片记录了珍贵的瞬间,展现了生活的美好,值得细细品味和珍藏。"
elif length == 'short' and len(caption) > 20:
caption = caption[:20] + "..."
return caption
def _fallback_suitability_analysis(self):
"""备用风格分析"""
return {
'recommended_styles': ['creative', 'social', 'emotional'],
'most_suitable': 'creative',
'analysis': '创意文艺风格最适合表达照片的艺术美感'
}
def generate_photo_caption_deepseek(image_description, style='creative', length='medium'):
"""使用DeepSeek为照片生成文案"""
try:
copywriter = DeepSeekCopywriter()
return copywriter.generate_photo_caption(image_description, style, length)
except Exception as e:
raise Exception(f"DeepSeek文案生成失败: {str(e)}")
def generate_multiple_captions_deepseek(image_description, count=3, style='creative'):
"""使用DeepSeek生成多个文案选项"""
try:
copywriter = DeepSeekCopywriter()
return copywriter.generate_multiple_captions(image_description, count, style)
except Exception as e:
raise Exception(f"DeepSeek多文案生成失败: {str(e)}")
def analyze_photo_suitability_deepseek(image_description):
"""使用DeepSeek分析照片适合的文案风格"""
try:
copywriter = DeepSeekCopywriter()
return copywriter.analyze_photo_suitability(image_description)
except Exception as e:
raise Exception(f"DeepSeek风格分析失败: {str(e)}")
def check_deepseek_config():
"""检查DeepSeek配置是否完整"""
try:
api_key = os.getenv('DEEPSEEK_API_KEY')
if not api_key:
return False, "DeepSeek API密钥未配置"
# 测试连接
copywriter = DeepSeekCopywriter()
return True, "DeepSeek配置正确"
except Exception as e:
return False, f"DeepSeek配置错误: {str(e)}"