D1-基于本地Ollama模型的单轮问答系统
概述
本程序([gradio_v2.py](file://i:\OneDrive\1_LLM_Project\2_Agent\MyAgent\gradio_v2.py))是一个基于 Gradio 和 Ollama API 构建的支持多轮对话的小学作文生成器。相比前一版本,该版本新增了对话历史记录、token 数量统计、参数调节和清空对话功能,提升了用户体验与交互灵活性。
程序通过抽象基类 [LLMAgent](file://i:\OneDrive\1_LLM_Project\2_Agent\MyAgent\gradio_v2.py#L12-L15) 实现模块化设计,当前使用 [OllamaAgent](file://i:\OneDrive\1_LLM_Project\2_Agent\MyAgent\gradio_v2.py#L18-L70) 作为具体实现,调用本地部署的 Ollama 大模型(如 qwen3:8b
)生成作文内容,并提供一个交互式 Web 界面供用户操作。
未来可轻松扩展为其他 LLM 平台(如 OpenAI、HuggingFace),只需实现新的 [LLMAgent](file://i:\OneDrive\1_LLM_Project\2_Agent\MyAgent\gradio_v2.py#L12-L15) 子类即可。
环境安装
依赖安装
需要以下 Python 库:
gradio
: 创建交互式 Web 界面。requests
: 发送 HTTP 请求到 Ollama API。- [json](file://i:\OneDrive\1_LLM_Project\2_Agent\OpenManus\config\mcp.example.json): 解析 API 响应数据(Python 内置)。
logging
: 记录运行日志(Python 内置)。abc
: 定义抽象基类(Python 内置)。tiktoken
: 精确计算 token 数量(用于估算输入和历史长度)。
安装命令:
pip install gradio requests tiktoken
建议使用 Python 3.8 或以上版本。
Ollama 服务配置
- 安装 Ollama
- 下载并安装:https://ollama.ai/
- 启动 Ollama 服务
ollama serve
- 默认监听地址:
http://localhost:11434
- 默认监听地址:
- 下载模型
ollama pull qwen3:8b
- 验证模型
ollama list
运行程序
- 将代码保存为 [gradio_v2.py](file://i:\OneDrive\1_LLM_Project\2_Agent\MyAgent\gradio_v2.py)
- 确保 Ollama 正在运行
- 执行程序:
python gradio_v2.py
- 打开浏览器访问界面(通常为
http://127.0.0.1:7860
) - 输入提示词,调整参数后点击“生成作文”,查看结果及对话历史
代码解释
1. 依赖导入
import gradio as gr
import requests
import json
import logging
from abc import ABC, abstractmethod
import tiktoken
tiktoken
:精确计算文本 token 数量,用于优化大模型输入控制。
2. 日志配置
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
- 设置日志级别为
INFO
,记录 API 调用和错误信息,便于调试。
3. 抽象基类:[LLMAgent](file://i:\OneDrive\1_LLM_Project\2_Agent\MyAgent\gradio_v2.py#L12-L15)
class LLMAgent(ABC):@abstractmethoddef generate_response(self, prompt):pass
- 定义通用接口,所有 LLM Agent 必须实现 [generate_response](file://i:\OneDrive\1_LLM_Project\2_Agent\MyAgent\gradio_v2.py#L14-L15) 方法。
- 支持未来扩展多种 LLM 接口(如 OpenAI、Anthropic)。
4. 具体实现:[OllamaAgent](file://i:\OneDrive\1_LLM_Project\2_Agent\MyAgent\gradio_v2.py#L18-L70)
class OllamaAgent(LLMAgent):def __init__(self, config): ...def set_max_history_length(self, max_rounds): ...def set_parameters(self, max_tokens, temperature): ...def generate_response(self, prompt): ...def clear_history(self): ...
- 对话历史管理:维护
history
列表,支持多轮对话。 - 参数设置:动态调整
max_tokens
与temperature
。 - Token 控制:自动截断历史以防止超出模型上下文限制。
- 异常处理:捕获网络请求失败和 JSON 解析错误,返回用户友好的提示。
5. Token 统计函数
def calculate_tokens(text): ...
def calculate_history_tokens(history): ...
- 使用
tiktoken
精确估算 token 数量。 - 提升对大模型输入长度的控制能力,避免超限错误。
6. 格式转换函数
def format_history_for_chatbot(history): ...
- 将内部 [history](file://i:\OneDrive\1_LLM_Project\2_Agent\MyAgent\gradio_v2.py#L0-L0) 结构转换为
gr.Chatbot
所需格式[user_msg, assistant_msg]
。
7. 主逻辑函数:[generate_essay](file://i:\OneDrive\1_LLM_Project\2_Agent\MyAgent\gradio_v2.py#L105-L111)
def generate_essay(prompt, agent, max_rounds, max_tokens, temperature): ...
- 设置最大对话轮数与生成参数。
- 调用
agent.generate_response
获取响应。 - 返回格式化后的对话历史、最新回复与 token 数量。
8. 辅助函数
def update_token_count(prompt): ...
def clear_conversation(agent): ...
- 实时更新输入 token 数量。
- 清空对话历史并重置状态。
9. 主函数:[main](file://i:\OneDrive\1_LLM_Project\2_Agent\MyAgent\gradio_v2.py#L120-L199)
def main():config = { ... }agent = OllamaAgent(config)with gr.Blocks(...) as demo:# UI 组件定义...demo.launch()
- UI 功能增强:
- 支持输入框、token 显示、滑动条参数调节、清空按钮。
- 对话历史展示采用
gr.Chatbot
,提升可视化体验。
- Gradio 事件绑定:
prompt_input.change()
:实时更新 token 数量。submit_button.click()
:触发作文生成。clear_button.click()
:清空对话历史。
运行流程图
graph TDA[用户输入提示词] --> B[点击 submit_button]B --> C[调用 generate_essay(prompt, agent, 参数)]C --> D[调用 agent.set_* 设置参数]D --> E[调用 agent.generate_response(prompt)]E --> F[发送 POST 请求至 Ollama API]F --> G[接收并解析 JSON 响应]G --> H[更新 chatbot 对话历史与输出结果]
注意事项
- Ollama 服务:确保服务运行并监听在
http://localhost:11434/v1
。 - 模型可用性:确认
qwen3:8b
已下载。 - token 上限:注意模型的最大上下文长度(如 4096 tokens),避免因历史过长导致超限。
- 参数影响:
temperature
影响生成多样性,值越低越确定;[max_tokens](file://i:\OneDrive\1_LLM_Project\2_Agent\MyAgent\gradio_v2.py#L0-L0) 控制输出长度。 - 调试信息:查看终端日志,确认 API 响应是否正常或是否有错误发生。
未来扩展建议
- 多模型支持:添加
OpenAIAgent
等子类,通过下拉菜单切换模型。 - 配置文件化:将 [config](file://i:\OneDrive\1_LLM_Project\2_Agent\OpenManus\app\config.py#L0-L0) 移出硬编码,支持从 JSON/YAML 文件读取。
- 异步请求:使用
aiohttp
替换requests
,提高并发性能。 - 对话持久化:将历史对话保存到本地文件或数据库。
- 用户登录与权限管理:区分不同用户的对话记录。
- 移动端适配:优化界面布局以适配手机端使用。
示例使用
- 启动程序后访问
http://127.0.0.1:7860
- 输入提示:“帮我写一篇小学作文 我的老师”
- 调整参数(如 max_tokens=1000,temperature=0.2)
- 点击“生成作文”,显示如下示例:
我的老师我的语文老师姓李,我们都叫她李老师。她有一头乌黑的长发,总是扎成一个马尾辫,走起路来像只轻盈的小鹿。最特别的是她的眼睛,像两颗黑葡萄,笑起来会弯成月牙的形状。...