自动化 LLM 对话:用 Go 构建 GUI 工具对比语言模型
让两个语言模型自动对话,能开启测试、对比和分析 AI 行为的无限可能。这个基于 Fyne 的 Go GUI 工具可视化整个过程,为研究者和开发者提供了一个便捷工具,通过 Ollama 操作本地 LLM。
LLM 对话应用架构
程序是一个基于 Fyne 的桌面应用,界面直观,便于设置和控制对话。左侧面板是控制区:从 ollama list 输出中选择两个模型,可选分配角色、输入对话主题、设置轮次上限和分钟级超时。右侧显示聊天流程,带颜色编码的消息和时间戳。
核心技术亮点:
- 利用本地 Ollama 服务器(端口 11434)
- HTTP API 处理模型交互
- 每个模型独立管理上下文,保留最近 20 条消息
- 通过 Go 上下文实现超时控制,避免卡死
- 重置机制清空对话历史
实现模型交互
应用采用结构化方式管理对话。每个模型维护自己的上下文,包括系统消息(含角色)和聊天历史,确保交流连贯且不膨胀上下文。
对话流程:
- 为两个模型初始化上下文,带系统提示
- 按设定轮次交替发言
- 每轮响应后更新双方历史
- 通过上下文强制超时
调用 Ollama API 的示例代码:
func callOllamaAPI(ctx context.Context, model string, messages []Message) (string, error) {
requestBody := ChatRequest{
Model: model,
Messages: messages,
Stream: false,
}
requestBody.Options.NumPredict = 1024
jsonData, err := json.Marshal(requestBody)
if err != nil {
return "", fmt.Errorf("request marshal error: %v", err)
}
req, err := http.NewRequestWithContext(ctx, "POST",
"http://localhost:11434/api/chat",
bytes.NewBuffer(jsonData))
if err != nil {
return "", fmt.Errorf("request creation error: %v", err)
}
req.Header.Set("Content-Type", "application/json")
client := &http.Client{Timeout: 0}
resp, err := client.Do(req)
if err != nil {
return "", fmt.Errorf("HTTP request error: %v", err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return "", fmt.Errorf("response read error: %v", err)
}
var response ChatResponse
if err := json.Unmarshal(body, &response); err != nil {
return "", fmt.Errorf("JSON parse error: %v", err)
}
return response.Message.Content, nil
}
实际应用场景
这个工具为技术从业者带来多重价值:
- 模型对比
- 用相同提示测试 LLM
- 发现风格、语气和内容差异
- 分析聊天中的一致性和矛盾
- 角色影响研究
- 为模型分配人格
- 观察角色带来的行为变化
- 实验 AI 社交动态
- 边界案例测试
- 检查长对话稳定性
- 探查棘手或冲突话题处理
- 评估上下文保留能力
- 教育与演示
- 展示 LLM 机制
- 可视化文本生成
- 探索 AI 应用设计模式
实现细节
技术栈:
- Fyne 构建 GUI
- Go 标准库 处理网络和 JSON
- Ollama API 驱动 LLM
- Goroutines 和互斥锁 实现并发
- 上下文 控制超时
核心数据结构:
Message表示单条消息ChatRequest和ChatResponse用于 API 调用ModelContext管理模型状态ConversationState跟踪聊天guiApp作为主应用结构体
优化与扩展
提升性能和功能:
- 缓存重复模型响应
- 添加实时流式输出
- 导出聊天记录为 JSON、Markdown、PDF
- 集成对话质量指标
- 支持生成参数(temperature、top_p)
- 从文件加载自定义提示
核心要点
- 无需人工干预,实现 LLM 对抗对话
- Fyne GUI 轻松调整参数
- 支持本地 Ollama,无云端依赖
- 智能上下文和历史管理,确保连贯
- 完美适用于 AI 对比、测试和研究
— Editorial Team
暂无评论。