基于Deepseek和Langchain的cp文学生成器(上)
前言
在上一篇文章中我们介绍了基本的关于Deepseek和Langchain生成长文本的方法,在这一篇的内容中,我们将会更多的引入关于prompt工程和前后端的内容。
一、Prompt 工程
Prompt 是与语言模型(如 GPT-3 或 GPT-4)交互的输入内容。它是用来告诉模型你想要什么结果的一段文字或指令。良好的 Prompt 设计可以大幅提升生成内容的质量和相关性。Prompt的示例如下:
你是一个专业的故事生成助手,请为以下设定生成一个故事:
角色1:勇敢的骑士
角色2:聪明的巫师
情节:一起对抗邪恶的龙
风格:浪漫
Prompt 的核心作用:
1.提供上下文:告诉模型它的角色和需要完成的任务。
2.设定输出格式:指定内容的风格、格式或结构。
3.提高输出质量:通过设计良好的 Prompt,减少生成无关内容的可能性。
Prompt template
Prompt template是一种带有占位符的 Prompt,用来动态地填充内容。它更灵活,可以将用户输入的变量插入到 Prompt 中,生成特定的输出。
本文使用的Prompt template如下所示:
custom_prompt = PromptTemplate(
input_variables=["input", "tools", "tool_names", "agent_scratchpad"],
template="""
你是一个非常聪明的故事生成助手,帮助用户根据工具生成高质量的故事。
以下是用户输入的信息:
用户输入:{input}
以下是可用的工具:
{tools}
工具的名称:
{tool_names}
工具执行记录:
{agent_scratchpad}
请使用相关工具生成故事,并输出最终的完整故事结果:
""",
)
Prompt Template 的主要特点
- 动态性:使用占位符(如 {role_1}、{plot})将用户输入动态插入到 Prompt 中。
方便生成多样化的内容。 - 可重用性:一个模板可以多次使用,只需修改占位符对应的变量值。
- 与框架集成:在 LangChain 等框架中,PromptTemplate 是标准工具,可以与 LLM(大语言模型)或工具链无缝集成。
二、Flask框架
Flask 是一个基于 Python 的微型 Web 框架,它用于构建 Web 应用程序。Flask 非常轻量且灵活,遵循简洁的设计理念,是开发者构建简单到中等复杂 Web 应用的理想选择。
Flask 的核心特点
- 轻量级和微型框架:Flask 是“微框架”,只提供了核心功能,例如路由、请求处理等,开发者可以根据需求扩展功能。
- 模块化和灵活性:你可以按需添加功能(比如数据库支持、身份验证),而不是强制使用某种特定的工具或库。
- 内置开发服务器和调试器:Flask 自带一个开发服务器和调试工具,方便开发和调试。
- Jinja2 模板引擎:内置强大的模板引擎 Jinja2,可以快速渲染 HTML 页面。
- 丰富的扩展支持:提供丰富的扩展(如 Flask-SQLAlchemy、Flask-WTF 等),用于数据库集成、表单处理、用户认证等。
- 社区支持:Flask 有一个庞大且活跃的开发者社区,拥有大量教程、插件和文档资源。
典型的Flask结构
my_flask_app/
├── app.py # 主程序
├── templates/ # 模板文件夹
│ ├── index.html
│ └── layout.html
├── static/ # 静态文件夹
│ ├── styles.css
│ ├── script.js
│ └── images/
│ └── logo.png
├── instance/ # 配置文件夹(可选)
│ └── config.py
└── requirements.txt # 依赖列表
本文也是使用了flask框架来进行前后端的交互,Flask 提供了对 HTTP 方法(GET、POST 等)的支持,以及方便的请求处理工具。它更加适合轻量级任务。本文的flask框架如下:
本文中也设置了专门的html文件来构建前端样式,并设计CSS样式。前端设计的相关方式和代码将会在后续提到。下述代码是本文构建flask app的相关代码。
from flask import Flask, render_template, request
from story_agent import generate_cp_story
app = Flask(__name__)
@app.route("/", methods=["GET", "POST"])
def index():
story = None
error = None
if request.method == "POST":
try:
# 获取用户输入
role_1 = request.form.get("role_1")
role_2 = request.form.get("role_2")
character_1 = request.form.get("character_1")
character_2 = request.form.get("character_2")
plot = request.form.get("plot")
style = request.form.get("style", "温情")
word_count = int(request.form.get("word_count", 1000))
# 调用故事生成逻辑
story = generate_cp_story(role_1, role_2, character_1, character_2, plot, style, word_count)
except Exception as e:
error = f"生成故事时出错:{
str(e)}"
return render_template("agent.html", story=story, error=error)
if __name__ == "__main__":
app.run(debug=True)
前端设计
本文设计了CSS文件确保前端的输出,CSS是设计前端样式的相关代码,完整的html文件代码如下述代码所示:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CP 故事生成器</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-image:url('/static/images/1.jpg') ; /* Replace with your background image path */
background-size: cover;
background-position: center;
color: #333;
}
h1 {
text-align: center;
margin-top: 20px;
color: #fff;
}
form {
max-width: 400px;
margin: 50px auto;
padding: 20px;
background: rgba(255, 255, 255, 0.8);
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
input, select, button {
width: calc(100% - 20px);