AI Agent 生态再添一员,Kratos 带着他的武器 Blades 走来了!

想必广大 Gopher 对 b 站开源的 Go 微服务框架 Kratos 并不陌生,如今 Kratos 生态中又新增了一款开源多模态 AI Agent 框架 Blades,它支持自定义模型、工具、记忆体、中间件等,适用于多轮对话、链式推理和结构化输出等。

快速开始

与大模型进行聊天(Chat):

go 复制代码
package main

import (
	"context"
	"log"

	"github.com/go-kratos/blades"
	"github.com/go-kratos/blades/contrib/openai"
	"github.com/openai/openai-go/v2/option"
)

func main() {
	agent := blades.NewAgent(
		"Template Agent",
		blades.WithModel("deepseek-chat"),
		blades.WithProvider(openai.NewChatProvider(
			option.WithBaseURL("https://api.deepseek.com"),
			option.WithAPIKey("sk-xxx"),
		)),
	)

	// Define templates and params
	params := map[string]any{
		"topic":    "人工智能的未来",
		"audience": "普通读者",
	}

	// Build prompt using the template builder
	// Note: Use exported methods when calling from another package.
	prompt, err := blades.NewPromptTemplate().
		System("请将 {{.topic}} 总结为三个关键点。", params).
		User("对 {{.audience}} 受众做出简洁准确的回复。", params).
		Build()
	if err != nil {
		log.Fatal(err)
	}

	log.Println("Generated Prompt:", prompt.String())

	// Run the agent with the templated prompt
	result, err := agent.Run(context.Background(), prompt)
	if err != nil {
		log.Fatal(err)
	}
	log.Printf("Generated result:\n%s", result.Text())
}

blades.NewAgent() 用于构造一个 Agent 对象,这里使用 DeepSeek 模型作为演示。

blades.NewPromptTemplate() 用于构造 Prompt 模板,这里使用了 Bilder 设计模式,你可以参考我的另一篇文章《Builder 模式在 Go 语言中的应用》进行更深入的学习。

agent.Run() 方法执行 Agent,等待大模型输出结果并返回。

示例程序运行结果如下:

bash 复制代码
$ go run chat.go                           
2025/09/28 23:16:03 Generated Prompt: [Text: 请将 人工智能的未来 总结为三个关键点。)][Text: 对 普通读者 受众做出简洁准确的回复。)]
2025/09/28 23:16:03 Processing message: system [{请将 人工智能的未来 总结为三个关键点。}]
2025/09/28 23:16:03 Processing message: user [{对 普通读者 受众做出简洁准确的回复。}]
2025/09/28 23:16:07 Generated result:
1. **智能的扩展**:人工智能将更深入地融入日常生活,提升效率并解决复杂问题。  
2. **伦理与责任**:技术发展需关注数据隐私、算法公平性及社会影响。  
3. **人机协作**:未来重点在于人类与AI互补合作,而非取代。

第 1 行日志记录了生成的最终 Prompt,较为遗憾的是 Prompt 输出未能打印类型(role:system/user 等),不够清晰。

好在第 2、3 两行日志输出结果中打印了 Prompt 类型。但这是 Blades 框架内部输出的,我们暂时还无法控制。

最终输出大模型生成结果。

流式输出

作为一个 AI Agent 框架,Blades 必然支持流式输出:

go 复制代码
stream, err := agent.RunStream(context.Background(), prompt)
if err != nil {
    log.Fatal(err)
}
for stream.Next() {
    chunk, err := stream.Current()
    if err != nil {
        log.Fatalf("stream recv error: %v", err)
    }
    log.Print(chunk.Text())
}

只需要 agent.Run() 方法替换为 agent.RunStream() 即可获取大模型的流式输出内容。

使用 for 循环遍历流式输出结果,这是典型的 Go 迭代器用法。你可以参考我的另一篇文章《万字长文:彻底掌握 Go 1.23 中的迭代器------使用篇》和《万字长文:彻底掌握 Go 1.23 中的迭代器------原理篇》进行更深入的学习。

示例程序运行结果如下:

bash 复制代码
$ go run streaming.go
2025/09/28 23:26:41 Generated Prompt: [Text: 请将 人工智能的未来 总结为三个关键点。)][Text: 对 普通读者 受众做出简洁准确的回复。)]
2025/09/28 23:26:41 Processing message: system [{请将 人工智能的未来 总结为三个关键点。}]
2025/09/28 23:26:41 Processing message: user [{对 普通读者 受众做出简洁准确的回复。}]
2025/09/28 23:26:42 
2025/09/28 23:26:42 1
2025/09/28 23:26:43 .
2025/09/28 23:26:43  
2025/09/28 23:26:43 人工智能
2025/09/28 23:26:43 将
2025/09/28 23:26:43 更
...
2025/09/28 23:26:45 。
2025/09/28 23:26:45 
2025/09/28 23:26:45 1. 人工智能将更普及,融入日常生活,提升效率和便利性。
2. 伦理与安全成为重点,确保技术发展符合人类价值观。
3. 人机协作增强,AI辅助人类解决复杂问题,而非取代人类。

NOTE:

由于流式输出内容过多,日志中省略了大部分流式输出行。

多轮对话

与大模型进行多轮对话(Conversation):

go 复制代码
package main

import (
	"context"
	"log"

	"github.com/go-kratos/blades"
	"github.com/go-kratos/blades/contrib/openai"
	"github.com/go-kratos/blades/memory"
	"github.com/openai/openai-go/v2/option"
)

func main() {
	agent := blades.NewAgent(
		"History Tutor",
			blades.WithModel("deepseek-chat"),
			blades.WithProvider(openai.NewChatProvider(
				option.WithBaseURL("https://api.deepseek.com"),
				option.WithAPIKey("sk-xxx"),
			)),
		blades.WithInstructions("你是一位知识渊博的历史导师。提供详细、准确的历史事件信息。"),
		blades.WithMemory(memory.NewInMemory(10)),
	)
	// Example conversation in memory
	prompt := blades.NewConversation(
		"conversation_123",
		blades.UserMessage("你能告诉我第二次世界大战的起因吗?"),
	)
	result, err := agent.Run(context.Background(), prompt)
	if err != nil {
		log.Fatal(err)
	}
	log.Println(result.Text())

	prompt = blades.NewConversation(
		"conversation_123",
		blades.UserMessage("我刚刚问你的问题是什么?"),
	)
	result, err = agent.Run(context.Background(), prompt)
	if err != nil {
		log.Fatal(err)
	}
	log.Println(result.Text())
}

多轮对话需要记录历史聊天上下文,所以在使用 blades.NewAgent() 构造 Agent 时,使用 blades.WithMemory(memory.NewInMemory(10)) 来实现。

blades.NewConversation() 构造一个带有会话 ID 的 Prompt。多次聊天,Prompt 中携带同一个会话 ID,即可实现多轮对话功能。

总结

Blades 为我们使用 Go 语言开发 AI Agent 带来了新的选择,本文介绍了使用 Blades 实现 AI Agent 的 3 个小示例,更多使用示例可以在官方 GitHub 仓库 examples 目录中查看。

Blades 目前处于刚起步阶段,代码量并不多,如果你感兴趣,可以继续阅读源码进行深度学习。

本文示例源码我都放在了 GitHub 中,欢迎点击查看。

希望此文能对你有所启发。

联系我

相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
回眸&啤酒鸭2 天前
【回眸】Minicart 电商购物车核心功能落地指南
人工智能
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
一隅论数智2 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
AI的探索之旅2 天前
97 个 OpenCV 实例(三十):双目立体,从标定到点云
人工智能·opencv·计算机视觉
AlbertZein2 天前
Step-5-Preview 上手实测:3D 游戏、金融分析、网页设计一次跑完
人工智能·aigc
LaughingZhu2 天前
Product Hunt 每日热榜 | 2026-09-19
人工智能·深度学习·神经网络·搜索引擎·百度
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk