202 lines
6.8 KiB
Python
202 lines
6.8 KiB
Python
![]() |
import requests
|
|||
|
import logging
|
|||
|
import json
|
|||
|
from django.conf import settings
|
|||
|
from datetime import datetime
|
|||
|
|
|||
|
logger = logging.getLogger(__name__)
|
|||
|
|
|||
|
class AIService:
|
|||
|
"""
|
|||
|
通用AI服务类,提供对不同AI模型的统一调用接口
|
|||
|
"""
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def call_silicon_cloud_api(messages, model="deepseek-ai/DeepSeek-V3", max_tokens=512, temperature=0.7):
|
|||
|
"""
|
|||
|
调用SiliconCloud API
|
|||
|
|
|||
|
Args:
|
|||
|
messages: 消息列表,格式为[{"role": "user", "content": "..."}, ...]
|
|||
|
model: 使用的模型名称,默认为DeepSeek-V3
|
|||
|
max_tokens: 最大生成token数
|
|||
|
temperature: 温度参数,控制创造性
|
|||
|
|
|||
|
Returns:
|
|||
|
tuple: (生成内容, 错误信息)
|
|||
|
"""
|
|||
|
try:
|
|||
|
# 获取API密钥
|
|||
|
api_key = getattr(settings, 'SILICON_CLOUD_API_KEY', '')
|
|||
|
if not api_key:
|
|||
|
return None, "未配置Silicon Cloud API密钥"
|
|||
|
|
|||
|
url = "https://api.siliconflow.cn/v1/chat/completions"
|
|||
|
|
|||
|
payload = {
|
|||
|
"model": model,
|
|||
|
"stream": False,
|
|||
|
"max_tokens": max_tokens,
|
|||
|
"temperature": temperature,
|
|||
|
"top_p": 0.7,
|
|||
|
"top_k": 50,
|
|||
|
"frequency_penalty": 0.5,
|
|||
|
"n": 1,
|
|||
|
"stop": [],
|
|||
|
"messages": messages
|
|||
|
}
|
|||
|
|
|||
|
headers = {
|
|||
|
"Authorization": f"Bearer {api_key}",
|
|||
|
"Content-Type": "application/json"
|
|||
|
}
|
|||
|
|
|||
|
# 设置代理(如果配置了)
|
|||
|
proxies = None
|
|||
|
proxy_url = getattr(settings, 'PROXY_URL', None)
|
|||
|
if proxy_url:
|
|||
|
proxies = {
|
|||
|
"http": proxy_url,
|
|||
|
"https": proxy_url
|
|||
|
}
|
|||
|
|
|||
|
# 发送请求
|
|||
|
logger.info(f"正在调用SiliconCloud API,模型: {model}")
|
|||
|
response = requests.post(url, json=payload, headers=headers, proxies=proxies)
|
|||
|
|
|||
|
if response.status_code != 200:
|
|||
|
logger.error(f"API请求失败,状态码: {response.status_code},响应: {response.text}")
|
|||
|
return None, f"API请求失败,状态码: {response.status_code}"
|
|||
|
|
|||
|
result = response.json()
|
|||
|
|
|||
|
# 从API响应中提取内容
|
|||
|
if 'choices' in result and result['choices']:
|
|||
|
content = result['choices'][0]['message']['content'].strip()
|
|||
|
return content, None
|
|||
|
else:
|
|||
|
logger.error(f"API响应格式错误: {result}")
|
|||
|
return None, "API响应格式错误,无法提取内容"
|
|||
|
|
|||
|
except requests.exceptions.RequestException as e:
|
|||
|
logger.error(f"API请求异常: {str(e)}")
|
|||
|
return None, f"API请求异常: {str(e)}"
|
|||
|
except Exception as e:
|
|||
|
logger.error(f"调用AI服务失败: {str(e)}")
|
|||
|
return None, f"调用AI服务失败: {str(e)}"
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def generate_email_reply(goal_description, conversation_summary, last_message):
|
|||
|
"""
|
|||
|
生成邮件回复话术
|
|||
|
|
|||
|
Args:
|
|||
|
goal_description: 用户目标描述
|
|||
|
conversation_summary: 对话摘要
|
|||
|
last_message: 达人最后发送的消息内容
|
|||
|
|
|||
|
Returns:
|
|||
|
tuple: (推荐话术内容, 错误信息)
|
|||
|
"""
|
|||
|
try:
|
|||
|
# 验证必要参数
|
|||
|
if not goal_description or not last_message:
|
|||
|
return None, "缺少必要参数:目标描述或最后消息"
|
|||
|
|
|||
|
# 准备提示信息
|
|||
|
prompt = f"""
|
|||
|
请为用户提供一条回复达人邮件的推荐话术,帮助用户实现销售目标。
|
|||
|
|
|||
|
用户目标:{goal_description}
|
|||
|
|
|||
|
对话摘要:{conversation_summary or '无对话摘要'}
|
|||
|
|
|||
|
达人最后发送的消息:
|
|||
|
{last_message}
|
|||
|
|
|||
|
要求:
|
|||
|
1. 回复应当专业礼貌,并围绕用户目标展开
|
|||
|
2. 提供有说服力的话术,推动促成合作
|
|||
|
3. 不超过200字
|
|||
|
4. 直接给出回复内容,不要包含任何额外解释
|
|||
|
"""
|
|||
|
|
|||
|
messages = [
|
|||
|
{
|
|||
|
"role": "system",
|
|||
|
"content": "你是一名专业的邮件回复助手,你的任务是生成有效的销售话术,帮助用户实现销售目标。"
|
|||
|
},
|
|||
|
{
|
|||
|
"role": "user",
|
|||
|
"content": prompt
|
|||
|
}
|
|||
|
]
|
|||
|
|
|||
|
# 调用通用API方法
|
|||
|
return AIService.call_silicon_cloud_api(
|
|||
|
messages,
|
|||
|
model="Pro/deepseek-ai/DeepSeek-R1",
|
|||
|
max_tokens=512,
|
|||
|
temperature=0.7
|
|||
|
)
|
|||
|
|
|||
|
except Exception as e:
|
|||
|
logger.error(f"生成回复话术失败: {str(e)}")
|
|||
|
return None, f"生成回复话术失败: {str(e)}"
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def generate_conversation_summary(conversation_history):
|
|||
|
"""
|
|||
|
生成对话摘要
|
|||
|
|
|||
|
Args:
|
|||
|
conversation_history: 对话历史记录列表
|
|||
|
|
|||
|
Returns:
|
|||
|
tuple: (摘要内容, 错误信息)
|
|||
|
"""
|
|||
|
try:
|
|||
|
if not conversation_history:
|
|||
|
return None, "无对话历史,无法生成摘要"
|
|||
|
|
|||
|
# 构造对话历史文本
|
|||
|
conversation_text = "\n\n".join([
|
|||
|
f"**{'用户' if msg.get('is_from_user', False) else '达人'}**: {msg.get('content', '')}"
|
|||
|
for msg in conversation_history
|
|||
|
])
|
|||
|
|
|||
|
# 准备提示信息
|
|||
|
prompt = f"""
|
|||
|
请对以下用户与达人之间的对话内容进行总结:
|
|||
|
|
|||
|
{conversation_text}
|
|||
|
|
|||
|
要求:
|
|||
|
1. 总结应包含双方主要讨论的话题和关键点
|
|||
|
2. 特别关注产品详情、价格谈判、合作意向等商务要点
|
|||
|
3. 简明扼要,不超过200字
|
|||
|
4. 直接给出总结内容,不要包含任何额外解释
|
|||
|
"""
|
|||
|
|
|||
|
messages = [
|
|||
|
{
|
|||
|
"role": "system",
|
|||
|
"content": "你是一名专业的对话总结助手,擅长提取商务沟通中的关键信息。"
|
|||
|
},
|
|||
|
{
|
|||
|
"role": "user",
|
|||
|
"content": prompt
|
|||
|
}
|
|||
|
]
|
|||
|
|
|||
|
# 调用通用API方法
|
|||
|
return AIService.call_silicon_cloud_api(
|
|||
|
messages,
|
|||
|
model="Pro/deepseek-ai/DeepSeek-R1",
|
|||
|
max_tokens=512,
|
|||
|
temperature=0.5
|
|||
|
)
|
|||
|
|
|||
|
except Exception as e:
|
|||
|
logger.error(f"生成对话摘要失败: {str(e)}")
|
|||
|
return None, f"生成对话摘要失败: {str(e)}"
|