logo

手把手教你用Python+文心一言搭建AI看图写诗系统

作者:半吊子全栈工匠2025.09.18 18:04浏览量:0

简介:零基础搭建AI看图写诗网页应用,完整源码+技术解析+部署指南

手把手教你用Python+文心一言搭建AI看图写诗系统

一、项目背景与技术选型

在AI技术快速发展的今天,将图像识别自然语言处理结合的创意应用成为热门方向。本项目通过Python构建Web服务,集成文心一言大模型实现”看图写诗”功能,用户上传图片后系统自动生成符合意境的诗歌。

技术选型方面:

  • 后端框架:Flask轻量级Web框架(也可替换为FastAPI)
  • 图像处理:Pillow库进行基础图像处理
  • AI模型:文心一言API提供文本生成能力
  • 前端交互:HTML5+Bootstrap实现响应式界面
  • 部署方案:支持本地调试与云服务器部署

二、开发环境准备

2.1 系统要求

  • Python 3.7+
  • 推荐使用虚拟环境(venv或conda)
  • 文心一言API密钥(需申请)

2.2 依赖安装

  1. pip install flask pillow requests python-dotenv

2.3 目录结构

  1. /ai_poetry_project
  2. ├── app.py # 主程序
  3. ├── templates/
  4. └── index.html # 前端页面
  5. ├── static/
  6. └── style.css # 样式文件
  7. ├── utils/
  8. ├── image_processor.py # 图像处理
  9. └── api_client.py # API调用
  10. └── .env # 环境变量

三、核心功能实现

3.1 图像处理模块

  1. # utils/image_processor.py
  2. from PIL import Image
  3. import io
  4. import base64
  5. def process_image(image_bytes):
  6. """基础图像处理:调整大小、格式转换"""
  7. try:
  8. img = Image.open(io.BytesIO(image_bytes))
  9. # 调整为统一尺寸(示例:300x300)
  10. img = img.resize((300, 300))
  11. buffered = io.BytesIO()
  12. img.save(buffered, format="JPEG")
  13. return buffered.getvalue()
  14. except Exception as e:
  15. print(f"Image processing error: {e}")
  16. return None

3.2 文心一言API集成

  1. # utils/api_client.py
  2. import requests
  3. import os
  4. from dotenv import load_dotenv
  5. load_dotenv()
  6. API_KEY = os.getenv("ERNIE_API_KEY")
  7. SECRET_KEY = os.getenv("ERNIE_SECRET_KEY")
  8. def generate_poem(image_description):
  9. """调用文心一言生成诗歌"""
  10. url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions"
  11. headers = {
  12. 'Content-Type': 'application/json'
  13. }
  14. data = {
  15. "messages": [
  16. {
  17. "role": "user",
  18. "content": f"根据以下描述创作一首中文古诗:{image_description}\n要求:五言或七言,押平声韵"
  19. }
  20. ]
  21. }
  22. try:
  23. response = requests.post(url, json=data, headers=headers)
  24. result = response.json()
  25. return result.get("result", "")
  26. except Exception as e:
  27. print(f"API call failed: {e}")
  28. return "生成诗歌时发生错误"

3.3 Flask主程序

  1. # app.py
  2. from flask import Flask, render_template, request, jsonify
  3. from utils.image_processor import process_image
  4. from utils.api_client import generate_poem
  5. import os
  6. app = Flask(__name__)
  7. app.config['UPLOAD_FOLDER'] = 'static/uploads'
  8. os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
  9. @app.route('/')
  10. def index():
  11. return render_template('index.html')
  12. @app.route('/generate', methods=['POST'])
  13. def generate():
  14. if 'file' not in request.files:
  15. return jsonify({"error": "No file uploaded"}), 400
  16. file = request.files['file']
  17. img_bytes = file.read()
  18. # 简单图像处理(实际项目可增强)
  19. processed_img = process_image(img_bytes)
  20. # 生成描述(简化版,实际可用CLIP等模型)
  21. description = "一幅美丽的山水画,有青山绿水" # 实际项目应替换为图像描述生成
  22. # 调用文心一言
  23. poem = generate_poem(description)
  24. return jsonify({
  25. "poem": poem,
  26. # 可返回处理后的图片base64编码
  27. })
  28. if __name__ == '__main__':
  29. app.run(debug=True)

四、前端实现要点

4.1 HTML结构

  1. <!-- templates/index.html -->
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>AI看图写诗</title>
  6. <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
  7. <style>
  8. .preview-area { max-width: 400px; margin: 20px auto; }
  9. .poem-result { font-family: "KaiTi", serif; margin-top: 30px; }
  10. </style>
  11. </head>
  12. <body>
  13. <div class="container mt-5">
  14. <h1 class="text-center">AI看图写诗</h1>
  15. <div class="card mt-4">
  16. <div class="card-body">
  17. <form id="uploadForm" enctype="multipart/form-data">
  18. <div class="mb-3">
  19. <label for="imageUpload" class="form-label">选择图片</label>
  20. <input class="form-control" type="file" id="imageUpload" accept="image/*" required>
  21. </div>
  22. <button type="submit" class="btn btn-primary">生成诗歌</button>
  23. </form>
  24. <div class="preview-area text-center">
  25. <img id="imagePreview" style="max-width:100%; display:none;">
  26. </div>
  27. <div id="poemResult" class="poem-result text-center"></div>
  28. </div>
  29. </div>
  30. </div>
  31. <script>
  32. document.getElementById('uploadForm').addEventListener('submit', async (e) => {
  33. e.preventDefault();
  34. const formData = new FormData();
  35. const fileInput = document.getElementById('imageUpload');
  36. formData.append('file', fileInput.files[0]);
  37. // 显示预览
  38. const reader = new FileReader();
  39. reader.onload = (e) => {
  40. document.getElementById('imagePreview').src = e.target.result;
  41. document.getElementById('imagePreview').style.display = 'block';
  42. };
  43. reader.readAsDataURL(fileInput.files[0]);
  44. // 调用API
  45. const response = await fetch('/generate', {
  46. method: 'POST',
  47. body: formData
  48. });
  49. const result = await response.json();
  50. if (result.poem) {
  51. document.getElementById('poemResult').innerHTML = `
  52. <h4>生成的诗歌:</h4>
  53. <pre>${result.poem}</pre>
  54. `;
  55. }
  56. });
  57. </script>
  58. </body>
  59. </html>

五、部署与优化建议

5.1 本地调试

  1. # 设置环境变量
  2. export ERNIE_API_KEY="your_api_key"
  3. export ERNIE_SECRET_KEY="your_secret_key"
  4. # 运行应用
  5. python app.py

5.2 生产部署方案

  1. Nginx + Gunicorn

    1. pip install gunicorn
    2. gunicorn -w 4 -b 0.0.0.0:5000 app:app
  2. Docker化部署

    1. FROM python:3.9-slim
    2. WORKDIR /app
    3. COPY . .
    4. RUN pip install -r requirements.txt
    5. CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:5000", "app:app"]

5.3 性能优化方向

  • 添加图片压缩中间件
  • 实现API调用缓存
  • 增加异步任务队列(Celery)
  • 添加用户认证系统
  • 实现诗歌历史记录功能

六、完整源码获取

项目完整源码已上传至GitHub:[示例链接](实际发布时替换为真实链接),包含:

  • 所有源代码文件
  • 部署说明文档
  • 常见问题解答
  • 扩展功能建议

七、技术延伸思考

  1. 多模态融合:可集成CLIP模型实现更精准的图像描述
  2. 诗歌风格定制:通过prompt工程支持不同诗体(唐诗、宋词等)
  3. 社交功能:添加诗歌分享、点赞功能
  4. 移动端适配:开发PWA或小程序版本

本项目的核心价值在于展示了如何快速集成先进AI能力到Web应用中,开发者可根据实际需求进行功能扩展。建议初学者先完成基础版本,再逐步添加高级功能。

八、常见问题解决

  1. API调用失败:检查密钥配置和网络连接
  2. 图片上传失败:确认Nginx配置的client_max_body_size
  3. 诗歌质量不佳:优化prompt描述或尝试不同模型参数
  4. 跨域问题:在Flask中添加CORS支持

通过这个项目,开发者不仅能掌握Python Web开发技能,还能深入理解AI模型的应用方式,为开发更复杂的AI应用打下基础。

相关文章推荐

发表评论