一、Gradio是什么

1.介绍

  • Hugging Face 发布的开源 Python 包,可以为机器学习模型、API 或任意 Python 函数快速构建 demo 或web 应用,并且通过 Gradio 的内置共享功能可以快速生成对应的链接,而无需任何编程基础。
  • 官方网站:https://www.gradio.app/ 官方文档
  • 快速开始:https://www.gradio.app/guides/quickstart

2. 为什么要学习Gradio

  • 直观演示你的模型、API、函数:需要图形化的界面,但又不太需要过多关心界面
  • 快速部署和分享:只需要多添加一个参数 share=True,就会生成一个公共 URL(72 小时后过期),世界各地的人都可以访问
  • 公共 URL 格式示例:https://a23dsf231adb.gradio.liveve(注:示例 URL 末尾多了一个e,正确格式应为 xxx.gradio.live)

例:

import gradio as gr

def chat(message, history):
    return "我收到了:" + message

demo = gr.ChatInterface(chat)
demo.launch()

二、提示工程

1. 什么是提示工程

提示工程(Prompt Engineering)是一项通过优化提示词(Prompt)和生成策略,从而获得更好的模型返回结果的工程技术。好的 Prompt 需要不断调优,说清楚自己到底想要什么,要具体!不要让机器去猜测太多。为了不让机器去猜测,我们就需要告诉细节。拥有一些技巧,灵活掌握,可以事半功倍。

2. 提示词的构成

  • 指示(Instruction):描述要让它做什么?
  • 上下文(Context):给出与任务相关的背景信息
  • 例子(Examples):给出一些例子,让模型知道怎么回复
  • 输入(Input):任务的输入信息
  • 输出(Output Format):输出的格式,想要什么形式的输出?

3. 常见的提示词方法

instruction = """根据下面的上下文回答问题。保持答案简短且准确"""
context = """Teplizumab起源于一个位于新泽西的药品公司"""
query = """OKT3最初是从什么来源提取的?"""
prompt = f"""{instruction} ### 上下文 {context} ### 问题: {query}"""

instruction(指令):
告诉模型 “要做什么”:根据上下文回答问题,且答案要简短准确。
context(上下文):
给模型提供参考信息:Teplizumab 起源于新泽西的一家药品公司。
query(问题 / 输入):
用户的实际问题:OKT3 最初是从什么来源提取的?
prompt(最终拼接):
用 Python 的 f-string 把三部分拼起来,形成一个完整的提示词

4. shot learning 样本学习

  • one-shot learning: 只给一个 example(示例)
  • few-shot learning: 多个examples(示例)
  • zero-shot learning: 不给任何 examples(示例)

5. Chain-of-Thought 思维链

  • 定义:把一个复杂的任务,拆解成多个稍微简单的任务,让大语言模型分步来思考问题
  • 提示词:小明有 20 个苹果,吃了两个,又买了 5
    个,小明现在一共有多少苹果?
    提示词:小明有 20 个苹果,吃了两个,又买了 5 个,小明现在一共有多少苹果,通过思维链 CoT
    的方式来分析。
    (类似于在提问ai时加上“请逐步思考”

三、Dify API + Gradio的聊天小ai项目

1.项目开发思路

1.1 明确原始需求

我想做一个AI聊天网页,
后端用Dify的免费AI,
前端用Python快速搭建

1.2 拆解需求 → 技术选型

需求拆解:                     技术选型:
┌──────────────────┐         ┌──────────────────┐
│ ① 网页聊天界面    │   →     │ Gradio            │
│                  │         │ (Python写网页,     │
│                  │         │  专为AI演示设计)    │
├──────────────────┤         ├──────────────────┤
│ ② 调用AI服务     │   →     │ Dify API          │
│                  │         │ (封装了智谱等模型,  │
│                  │         │  免费额度)          │
├──────────────────┤         ├──────────────────┤
│ ③ 前后端连接     │   →     │ requests库        │
│                  │         │ (Python发送HTTP)   │
└──────────────────┘         └──────────────────┘

1.3 数据流设计

浏览器                  Python                    Dify
┌──────┐             ┌──────────┐             ┌──────────┐
│ 用户  │  输入"你好"  │ Gradio   │  POST请求    │ Dify API │
│ 界面  │───────────→│ 界面组件  │───────────→│ 服务器   │
│      │             │          │             │          │
│      │             │ chat_    │             │ LLM模型  │
│      │             │ with_    │             │ (智谱等)  │
│      │             │ dify()   │             │          │
│      │             │          │             │          │
│      │  显示回复    │          │  JSON响应    │          │
│      │←───────────│          │←───────────——│          │
└──────┘             └──────────┘             └──────────┘

2. Dify平台操作详解

2.1 在Dify中新建应用

创建空白应用

2.2 配置AI模型
  1. 点击「模型提供商」下拉框
  2. 选择「智谱AI」(或其他免费提供商)
  3. 在「模型」下拉框选「GLM-4-Flash」
    ⚠️ 确保选的模型标注了"免费"
  4. 点击「保存」
2.3 编写提示词(Prompt)

告诉AI"你是谁"、“怎么回答”
相当于给AI的人设和规则

示例:
你是一个专业、友好的AI助手。
回答要简洁准确,使用中文。
如果不知道答案,诚实地告诉用户。
2.4 配置输入变量(可选)

什么时候需要输入变量?
想让用户选择回答风格
需要传入特定参数

1. 点击「开始节点」(工作流最前面的节点)
2. 点击「+ 添加变量」
3. 设置变量名、类型

例如:
┌────────────────────┐
│ 变量名: language   │
│ 类型: string       │
│ 默认值: "中文"     │
└────────────────────┘

如果定义了变量,Python代码中要传:

"inputs": {
    "language": "中文"  # 变量名必须和Dify中定义的一致
}
2.5 发布应用

配置完成后:

  1. 点击右上角「发布」按钮
  2. 确认发布
  3. 系统会生成 API 密钥

密钥的位置:(访问api)
拿到API密钥(app-XXXXXXXXXXXXXXXXXXXXXXXX)和API端点

3. 开发步骤(python)

3.1 确认Dify端可用

# 测试代码(先不写Gradio)
import requests

response = requests.post(
    "https://api.dify.ai/v1/chat-messages",
    headers={"Authorization": "Bearer 你的密钥"},
    json={"inputs": {}, "query": "测试", 
          "response_mode": "blocking", "user": "test"}
)
print(response.json())  # 看能不能拿到 answer

💡 关键思维:最小可行性测试
不要一上来就写完整代码,先用最简单的方式验证API能通,通了再加Gradio界面

3.2 设计函数签名

看Gradio文档,确认它需要什么样的函数

# Gradio的ChatInterface要求:
def 你的函数(message: str, chat_history: list) -> str:
    # message: 用户最新消息
    # chat_history: 对话历史
    # 返回值: 要显示的AI回复文本

💡 关键思维:先看框架要求
不要自己发明函数参数,去Gradio文档查ChatInterface的fn参数要求,按框架规定写函数签名

3.3 配置API地址

url = "https://api.dify.ai/v1/chat-messages"

3.4 配置请求头

headers = {
    "Authorization": "Bearer app-你的密钥",
    "Content-Type": "application/json"
}

📌 类比理解headers:

寄快递:
┌─────────────────────┐
│ 收件人:Dify服务器   │  ← url
│ 寄件人:app-xxx     │  ← Authorization
│ 内容类型:JSON文件   │  ← Content-Type
│                     │
│ 📦 包裹内容:        │  ← data
│ {query: "你好"}     │
└─────────────────────┘

你不贴寄件人信息(不传headers)
→ 快递拒收(401错误)

3.5 配置请求体

data = {
    "inputs": {},
    "query": message,
    "response_mode": "blocking",
    "user": "test_user"
}

inputs ✅ 必须 字段名固定 Dify应用定义的输入变量
query ✅ 必须 字段名固定 用户的问题
response_mode ✅ 必须 字段名固定 blocking或streaming
user ✅ 必须 字段名固定 用户标识

3.6 发送请求

response = requests.post(url, headers=headers, json=data, timeout=20)
#          ↑            ↑     ↑              ↑        ↑
#       库名.方法   地址  请求头(认证)   请求体(数据)  超时

3.7 解析响应

res_json = response.json()
"""
	# 服务器的响应是字符串(JSON格式)
response.text = '{"answer": "你好!", "event": "message"}'

# response.json() 把它变成Python字典
res_json = {"answer": "你好!", "event": "message"}

# 这样就能用字典的方式取值
res_json["answer"]  # "你好!"

"""
return res_json.get("answer", "出错")
#             ↑           ↑
#         要取的key    key不存在时的默认值
# 如果answer不存在 → 返回"出错",程序正常运行

3.8 创建Gradio界面

demo = gr.ChatInterface(
    fn=chat_with_dify,                    # 处理函数
		# ✅ 正确:只传函数名,不加括号
    title="Dify+智谱免费AI",              # 网页标题
    description="纯国产、永久免费"         # 描述文字
)

3.9 启动服务

if __name__ == "__main__":
    demo.launch()
    # ① 启动本地Web服务器
	  # ② 默认地址:http://127.0.0.1:7860
    # ③ 自动在浏览器打开这个地址

3.10 完整函数

import gradio as gr
import requests

def chat_with_dify(message, chat_history):
    url = "https://api.dify.ai/v1/chat-messages"
    headers = {
        "Authorization": "Bearer app-AbgmfTKdiuA31XWkp5dya2vy",
        "Content-Type": "application/json"
    }
    data = {
        "inputs": {},
        "query": message,
        "response_mode": "blocking",
        "user": "test_user"
    }
    response = requests.post(url, headers=headers, json=data, timeout=20)  # ← 加上 headers
    res_json = response.json()
    return res_json.get("answer", "出错")

demo = gr.ChatInterface(
    fn=chat_with_dify,
    title="Dify+智谱免费AI",
    description="纯国产、永久免费"
)

if __name__ == "__main__":
    demo.launch()

4. 完整数据流

① 用户运行: python dify_chat.py
   ↓
② demo.launch() 启动网页服务器
   ↓
③ 浏览器打开 http://127.0.0.1:7860
   ↓
④ 用户输入"你好",点击发送
   ↓
⑤ Gradio自动调用: chat_with_dify("你好", [])
   ↓
⑥ 函数内部构造HTTP请求:
   POST https://api.dify.ai/v1/chat-messages
   headers: {"Authorization": "Bearer app-xxx"}
   body: {"query": "你好", ...}
   ↓
⑦ requests.post() 发送到Dify服务器
   ↓
⑧ Dify服务器:
   - 验证密钥 ✓
   - 读取 query
   - 调用LLM模型
   - 生成回答
   ↓
⑨ Dify返回JSON: {"answer": "你好!我是AI..."}
   ↓
⑩ response.json() 解析
   ↓
⑪ 返回 "你好!我是AI..."
   ↓
⑫ Gradio显示在网页上

5. 扩展函数——回调函数

5.1 直白定义

你写好交给别人,别人在合适时机帮你调用的函数。

# 你就是"你"
# Gradio就是"别人"

你写:def chat_with_dify(message, chat_history):
         return "AI的回复"

交给:demo = gr.ChatInterface(fn=chat_with_dify)
      #                        ↑ 把函数交给Gradio

Gradio:好的,用户发消息时我来调用它

5.2 为什么叫"回调"

“回调” = “回过头来调用”

普通函数调用(你主动):
  你 → 直接调用函数 → 得到结果
  chat_with_dify("你好", [])  # 你主动调

回调函数(别人回头调):
  你 → 把函数给Gradio → 继续做别的事
  ...过了一会...
  Gradio → 回头调用你的函数 → 得到结果
  chat_with_dify("你好", [])  # Gradio帮你调
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐