使用django调用deepseek api,搭建ai网站
一、deepseek简介
DeepSeek是一家人工智能公司,专注于开发先进的人工智能模型和技术。以下是关于DeepSeek的一些详细介绍:
1.公司背景
DeepSeek由杭州深度求索人工智能基础技术研究有限公司开发,致力于通过创新的技术和算法,推动人工智能领域的发展。
2.技术与模型
- DeepSeek-V3:这是DeepSeek开发的一个大型语言模型,具有超过600B的参数,在多项性能指标上与国际顶尖模型相当。
- DeepSeek-R1:这是DeepSeek的第一代推理模型,通过大规模强化学习(RL)进行训练,展示出了在推理任务上的优异性能。
- DeepSeek-R1-Distill:这些是从DeepSeek-R1中蒸馏出的小模型,具有更好的性能和效率,适合在资源受限的环境中使用。
3.应用领域
- 自然语言处理:DeepSeek的模型在文本生成、知识问答、推理等任务中表现出色,能够为用户提供高质量的语言交互服务。
- 智能助手:DeepSeek开发了AI智能助手,可用于搜索、写作、阅读、解题、翻译等多种任务,帮助用户提高效率。
4.优势与特点
- 成本优势:DeepSeek的模型训练成本低,调用接口成本也较低,具有较高的性价比。
- 中文处理能力强:对中文语法、成语、文化背景理解更深入,在中文文本生成、摘要、情感分析等任务中表现自然。
- 开源优势:DeepSeek-R1模型权重和技术报告开源,便于开发者二次开发和创新。
5.产品与服务
- DeepSeek API:提供与OpenAI兼容的API,方便开发者将DeepSeek的模型集成到自己的应用中。
- DeepSeek App:提供AI智能助手应用,可在App Store上下载,支持多种功能,如智能对话、搜索、写作等。
二、获取apikey
deepseek官方的api暂时无法充值,我使用的是阿里云的百炼平台的deepseek v1模型,阿里云百炼平台注册送百万token,可以白嫖。打开百炼控制台,开通服务,随便选择一个模型,点击右上角的“查看我的apikey”,获取apikey。
三、创建django项目,并startapp
使用django创建一个新的项目,python manage.py startapp chat新建app作为主要代码文件夹。
四、编写代码
chat\views.py
from django.shortcuts import render
from openai import OpenAI
import os
from django.conf import settings
def get_ai_response(messages):
client = OpenAI(
api_key="xxx",//填写apikey
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
try:
completion = client.chat.completions.create(
model="qwen2.5-14b-instruct-1m",
messages=messages
)
return {
'content': completion.choices[0].message.content,
'reasoning': getattr(completion.choices[0].message, 'reasoning_content', '')
}
except Exception as e:
return {
'content': f"发生错误:{str(e)}",
'reasoning': ''
}
def chat_view(request):
if 'messages' not in request.session:
request.session['messages'] = []
if request.method == 'POST':
user_message = request.POST.get('message', '')
if user_message:
request.session['messages'].append({'role': 'user', 'content': user_message})
response = get_ai_response(request.session['messages'])
request.session['messages'].append({
'role': 'assistant',
'content': response['content'],
'reasoning': response['reasoning']
})
request.session.modified = True
return render(request, 'chat.html', {
'messages': request.session['messages']
})
要将api_key="xxx"中xxx替换为自己的apikey。
urls.py
from django.contrib import admin
from django.urls import path
from chat import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.chat_view, name='chat'),
]
前端代码
<!DOCTYPE html>
<html>
<head>
<title>AI对话助手(Markdown支持版)</title>
<!-- Markdown 渲染依赖 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/github-markdown-css@5.2.0/github-markdown.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/github-dark.min.css">
<style>
:root {
--user-color: #1a73e8;
--assistant-color: #0b8043;
}
body {
max-width: 800px;
margin: 0 auto;
padding: 20px;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
background-color: #f8f9fa;
}
.chat-container {
background: white;
border-radius: 12px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
padding: 20px;
margin-bottom: 20px;
}
.message {
margin: 15px 0;
padding: 12px 16px;
border-radius: 8px;
}
.user-message {
background-color: #e8f0fe;
border: 1px solid var(--user-color);
margin-left: 30px;
}
.assistant-message {
background-color: #e6f4ea;
border: 1px solid var(--assistant-color);
margin-right: 30px;
}
.role-label {
font-weight: 500;
margin-bottom: 8px;
display: flex;
align-items: center;
gap: 8px;
}
.role-label::before {
content: '';
display: inline-block;
width: 12px;
height: 12px;
border-radius: 50%;
}
.user-message .role-label::before {
background: var(--user-color);
}
.assistant-message .role-label::before {
background: var(--assistant-color);
}
form {
display: flex;
gap: 10px;
margin-top: 20px;
}
input[type="text"] {
flex: 1;
padding: 12px;
border: 1px solid #ddd;
border-radius: 8px;
font-size: 16px;
}
button {
padding: 12px 24px;
background-color: var(--user-color);
color: white;
border: none;
border-radius: 8px;
cursor: pointer;
transition: background 0.2s;
}
button:hover {
background-color: #1557b0;
}
.markdown-body pre {
padding: 16px;
border-radius: 8px;
overflow-x: auto;
}
.reasoning-box {
margin-top: 12px;
padding: 12px;
background: #fff8e5;
border-left: 4px solid #ffd700;
border-radius: 4px;
}
</style>
</head>
<body>
<div class="chat-container">
<h1 style="color: var(--user-color); text-align: center;">AI对话助手</h1>
<div class="messages">
{% for message in messages %}
<div class="message {% if message.role == 'user' %}user-message{% else %}assistant-message{% endif %}">
<div class="role-label">
{% if message.role == 'user' %}
👤 用户
{% else %}
🤖 助手
{% endif %}
</div>
<!-- Markdown 内容容器 -->
<div class="markdown-body"
data-markdown="{{ message.content|escape }}"
data-raw="{{ message.content|escape }}">
{{ message.content|safe }}
</div>
{% if message.reasoning %}
<div class="reasoning-box">
<div class="reasoning-label">💡 思考过程</div>
<div class="markdown-body"
data-markdown="{{ message.reasoning|escape }}"
data-raw="{{ message.reasoning|escape }}">
{{ message.reasoning|safe }}
</div>
</div>
{% endif %}
</div>
{% endfor %}
</div>
<form method="post">
{% csrf_token %}
<input type="text" name="message" placeholder="请输入您的问题..." required autofocus>
<button type="submit">发送</button>
</form>
</div>
<!-- 依赖库 -->
<script src="https://cdn.jsdelivr.net/npm/marked@12.0.0/lib/marked.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dompurify@3.0.5/dist/purify.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/highlight.min.js"></script>
<script>
// 初始化配置
marked.setOptions({
breaks: true,
highlight: (code, lang) => {
const language = hljs.getLanguage(lang) ? lang : 'plaintext';
return hljs.highlight(code, { language }).value;
}
});
// Markdown 渲染函数
const renderMarkdown = () => {
document.querySelectorAll('.markdown-body').forEach(container => {
try {
// 优先使用 data-markdown 属性
const raw = container.dataset.markdown || container.dataset.raw;
const clean = DOMPurify.sanitize(raw, {
ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'code', 'pre', 'blockquote',
'ul', 'ol', 'li', 'h1', 'h2', 'h3', 'a', 'p', 'br', 'hr'],
ALLOWED_ATTR: ['href', 'target']
});
container.innerHTML = marked.parse(clean);
} catch (e) {
console.error('Markdown渲染失败:', e);
container.innerHTML = container.dataset.raw;
}
});
// 触发代码高亮
hljs.highlightAll();
};
// 确保依赖加载完成后执行
const checkDependencies = () => {
if (window.marked && window.DOMPurify && window.hljs) {
renderMarkdown();
} else {
setTimeout(checkDependencies, 100);
}
};
// 启动渲染流程
document.addEventListener('DOMContentLoaded', checkDependencies);
</script>
</body>
</html>
迁移数据库
python manage.py makemigrations
python manage.py migrate
五、效果展示
六、将模型切换为deepseek
切换模型只要修改model="qwen2.5-14b-instruct-1m"为deepseek.