#!/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)}"