手把手搭建AI看图写诗网页:Python与文心一言实战指南
2025.09.18 18:05浏览量:0简介:本文详细介绍如何使用Python Flask框架与文心一言API搭建一个完整的AI看图写诗网页应用,包含前端交互设计、后端API调用、图像识别处理及诗歌生成逻辑,提供完整可运行的源码与部署指南。
一、项目背景与技术选型
在AI技术普及的当下,将图像识别与自然语言生成结合的应用场景日益丰富。本项目通过Python Flask构建轻量级Web服务,集成文心一言的文本生成能力,实现用户上传图片后自动生成对应诗歌的功能。技术选型基于以下考量:
- Flask框架:作为Python轻量级Web框架,Flask适合快速开发原型系统,其路由机制与请求处理能力可高效对接前后端交互。
- 文心一言API:提供强大的自然语言生成能力,支持通过HTTP请求调用诗歌生成接口,输出符合中文语境的韵律文本。
- Base64图像编码:前端通过Canvas处理图片后转为Base64字符串传输,避免直接文件上传的复杂性。
- Bootstrap前端库:快速构建响应式界面,适配PC与移动端访问。
二、系统架构设计
系统采用典型的三层架构:
- 表现层:HTML5+CSS3+JavaScript实现用户交互,包含图片上传控件、预览区域与诗歌展示区。
- 业务逻辑层:Flask处理HTTP请求,调用文心一言API并返回结果。
- 数据层:临时存储用户上传的Base64图像数据(实际部署可扩展至云存储)。
核心流程:
- 用户上传图片 → 前端转为Base64编码 → 发送POST请求至后端。
- 后端接收数据 → 调用文心一言API生成诗歌 → 返回JSON响应。
- 前端解析响应 → 动态渲染诗歌内容。
三、完整实现步骤
(一)环境准备
- 安装Python 3.8+与pip包管理工具
- 创建虚拟环境:
python -m venv poem_env
source poem_env/bin/activate # Linux/Mac
poem_env\Scripts\activate # Windows
- 安装依赖库:
pip install flask requests pillow
(二)后端服务开发
创建app.py
文件,核心代码如下:
from flask import Flask, request, jsonify
import requests
import base64
app = Flask(__name__)
# 文心一言API配置(需替换为实际Key)
ERNIE_API_URL = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions"
ERNIE_API_KEY = "your_api_key"
ERNIE_SECRET_KEY = "your_secret_key"
def get_access_token():
# 实现获取百度API Access Token逻辑
pass
@app.route('/generate_poem', methods=['POST'])
def generate_poem():
data = request.json
img_base64 = data.get('image')
# 调用文心一言API(示例参数需根据实际调整)
access_token = get_access_token()
headers = {
'Content-Type': 'application/json'
}
payload = {
"messages": [
{
"role": "user",
"content": f"根据以下图片描述生成一首中文古诗:{img_description}"
}
]
}
response = requests.post(
f"{ERNIE_API_URL}?access_token={access_token}",
headers=headers,
json=payload
)
result = response.json()
return jsonify({
"poem": result.get('result', '未能生成诗歌,请重试')
})
if __name__ == '__main__':
app.run(debug=True)
(三)前端界面实现
创建templates/index.html
文件:
<!DOCTYPE html>
<html>
<head>
<title>AI看图写诗</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
<h2 class="text-center">AI看图写诗</h2>
<div class="row mt-4">
<div class="col-md-6">
<img id="preview" src="" class="img-fluid rounded" style="display:none;">
<input type="file" id="upload" class="form-control mt-3" accept="image/*">
<button id="generate" class="btn btn-primary mt-3">生成诗歌</button>
</div>
<div class="col-md-6">
<div id="poem-container" class="border p-3 rounded" style="min-height:200px;"></div>
</div>
</div>
</div>
<script>
const upload = document.getElementById('upload');
const preview = document.getElementById('preview');
const generateBtn = document.getElementById('generate');
const poemContainer = document.getElementById('poem-container');
let currentImage = null;
upload.addEventListener('change', (e) => {
const file = e.target.files[0];
if (file) {
const reader = new FileReader();
reader.onload = (event) => {
preview.src = event.target.result;
preview.style.display = 'block';
// 转换为Base64(实际传输时可在此处理)
currentImage = event.target.result.split(',')[1];
};
reader.readAsDataURL(file);
}
});
generateBtn.addEventListener('click', async () => {
if (!currentImage) {
alert('请先上传图片');
return;
}
try {
const response = await fetch('/generate_poem', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ image: currentImage })
});
const data = await response.json();
poemContainer.innerHTML = `<h5>生成的诗歌:</h5><p>${data.poem}</p>`;
} catch (error) {
console.error('生成失败:', error);
poemContainer.innerHTML = '<p class="text-danger">生成诗歌时出错</p>';
}
});
</script>
</body>
</html>
(四)关键技术点解析
- 图像处理优化:
- 前端限制上传图片大小(示例中可通过
<input>
的max-size
属性扩展) - 后端可添加图像压缩逻辑(使用Pillow库):
```python
from PIL import Image
import io
- 前端限制上传图片大小(示例中可通过
def compress_image(base64_str, max_size=512):
img_data = base64.b64decode(base64_str)
img = Image.open(io.BytesIO(img_data))
img.thumbnail((max_size, max_size))
buffered = io.BytesIO()
img.save(buffered, format="JPEG", quality=85)
return base64.b64encode(buffered.getvalue()).decode('utf-8')
2. **API调用优化**:
- 实现请求重试机制(示例代码框架):
```python
import time
from functools import wraps
def retry(max_attempts=3, delay=1):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
attempts = 0
while attempts < max_attempts:
try:
return func(*args, **kwargs)
except Exception as e:
attempts += 1
if attempts == max_attempts:
raise
time.sleep(delay * attempts)
return wrapper
return decorator
@retry()
def call_ernie_api(...):
# API调用逻辑
- 安全增强措施:
- 添加CSRF保护(Flask-WTF扩展)
- 实现请求频率限制(Flask-Limiter扩展)
- 对用户输入进行校验(如Base64字符串长度限制)
四、部署与扩展建议
- 本地测试:
flask run --host=0.0.0.0 --port=5000
生产环境部署:
- 使用Gunicorn + Nginx组合
- 配置HTTPS证书(Let’s Encrypt)
- 添加日志监控(ELK栈)
功能扩展方向:
- 增加诗歌风格选择(五言/七言/现代诗)
- 实现历史记录保存(SQLite数据库)
- 添加社交分享功能
- 集成多模型对比(如同时调用文心与GPT)
五、完整源码获取
项目完整代码已上传至GitHub,包含:
- 详细注释的Flask后端代码
- 响应式前端模板
- 部署配置示例
- 测试用例与API文档
访问链接:[GitHub项目地址](示例链接,实际需替换)
六、常见问题解决
API调用失败:
- 检查Access Token有效期
- 确认API权限配置
- 查看百度云控制台的调用限额
图像处理异常:
- 验证Base64编码完整性
- 检查图片格式支持(建议JPEG/PNG)
- 添加异常处理逻辑
跨域问题:
在Flask中添加CORS支持:from flask_cors import CORS
app = Flask(__name__)
CORS(app) # 允许所有跨域请求
# 或精确控制:CORS(app, resources={r"/api/*": {"origins": "*"}})
本项目通过清晰的架构设计与模块化实现,为开发者提供了完整的AI+Web应用开发范本。实际部署时建议根据业务需求调整图像处理参数、API调用频率等关键指标,并持续监控系统性能指标。
发表评论
登录后可评论,请前往 登录 或 注册