第16章 构建 AI 文本生成应用
文本生成是用 Gradio 演示 AI 应用最轻松的场景之一。
交互逻辑很直观:用户输入 prompt,应用将其发给模型,模型生成文本,结果显示在界面上。
但要做好,远不止放一个文本框加一个按钮那么简单。
基础架构
应用可以按以下流程运行:
Prompt
→ Validation
→ Model
→ Generated text
→ Output
从占位符开始
在接入真实模型之前,先搭建好界面。
import gradio as gr
def generate(prompt):
if not prompt.strip():
return "Please enter a prompt."
return f"Generated response for: {prompt}"
with gr.Blocks() as demo:
prompt = gr.Textbox(
label="Prompt",
lines=8,
placeholder="Write what you want the model to generate..."
)
button = gr.Button(
"Generate",
variant="primary"
)
output = gr.Textbox(
label="Generated Text",
lines=15
)
button.click(
fn=generate,
inputs=prompt,
outputs=output
)
demo.launch()
这就是基础框架。
添加生成参数
文本生成应用通常会提供以下可调参数:
最大输出长度
temperature
生成条数
重复处理策略
例如:
temperature = gr.Slider(
minimum=0,
maximum=2,
value=0.7,
step=0.1,
label="Temperature"
)
temperature 的作用是什么
temperature 主要影响生成结果的可预测性和多样性。
值越低,输出越确定;值越高,变化越大。
具体表现取决于模型和生成策略的实现。
别把 temperature 当成通用的"创意滑块"——它影响的是 token 采样方式,而非模型的智能程度。
接入参数
你的生成函数可能变成这样:
def generate(prompt, temperature):
return model.generate(
prompt,
temperature=temperature
)
然后:
button.click(
fn=generate,
inputs=[prompt, temperature],
outputs=output
)
最大 Token 数
你还可以暴露一个最大输出长度的选项。
max_tokens = gr.Slider(
minimum=50,
maximum=2000,
value=500,
step=50,
label="Maximum Output Length"
)
然后:
def generate(prompt, temperature, max_tokens):
return model.generate(
prompt,
temperature=temperature,
max_tokens=max_tokens
)
具体参数名取决于你使用的模型库。
Prompt 模板
有时候不应该让用户去写完整的 prompt。
更好的做法是由应用来构建 prompt。
例如:
def build_prompt(topic, tone):
return (
f"Write a {tone.lower()} explanation "
f"of {topic} for a beginner."
)
然后把生成的 prompt 发给模型。
这样非技术用户使用起来会更容易。
示例:文章生成器
import gradio as gr
def generate_article(topic, tone, length):
prompt = (
f"Write an article about {topic}. "
f"Use a {tone.lower()} tone. "
f"Target approximately {length} words."
)
return f"Model output for:\n\n{prompt}"
with gr.Blocks() as demo:
gr.Markdown("# AI Article Generator")
topic = gr.Textbox(
label="Topic"
)
tone = gr.Dropdown(
choices=[
"Professional",
"Friendly",
"Academic",
"Casual"
],
value="Friendly",
label="Tone"
)
length = gr.Slider(
minimum=100,
maximum=3000,
value=800,
step=100,
label="Target Length"
)
button = gr.Button(
"Generate Article",
variant="primary"
)
output = gr.Textbox(
label="Article",
lines=20
)
button.click(
fn=generate_article,
inputs=[topic, tone, length],
outputs=output
)
demo.launch()
准备好后,把占位输出替换为真实的模型调用。
流式生成
长文本生成往往需要一定时间。
不必等全部生成完毕,模型有时可以逐步流式输出部分结果。
概念上:
def generate(prompt):
for chunk in model_stream(prompt):
yield chunk
界面可以渐进式更新,从而显著提升感知上的响应速度。
处理空提示词
始终做输入校验。
if not prompt.strip():
return "Please enter a prompt."
也可以设置长度上限。
if len(prompt) > 5000:
return "Your prompt is too long."
生成文本并不天然正确
这对教育和专业场景尤其重要。
模型可能产生:
事实性错误
过时信息
虚构的引用
误导性解释
界面再精致,也不能让模型输出变得可靠。
如果你的应用面向高风险场景,可能需要额外的校验和人工审核。
动手试试
构建一个 AI 内容生成器,包含以下参数:
主题
目标受众
语气
输出长度
可选示例
返回生成的结果。
如果暂时没有可用的模型,可以先用占位函数实现完整界面,之后再接入真实模型。
要点总结
文本生成应用通常由提示词、模型和输出三部分组成。
生成参数可以通过 Gradio 控件暴露给用户。
提示词模板可以降低用户的使用门槛。
流式输出能提升感知上的响应速度。
发送提示词前先做校验。
不应默认将生成文本视为事实或权威内容。