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 中,欢迎点击查看。

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

联系我

相关推荐
llgdwuhan8 小时前
光制造突围 | 国产耦合设备的替代与迭代
人工智能·光模块·耦合测试设备·光模块耦合设备·芯片测试设备·双透镜自动耦合设备
秦先生在广东8 小时前
Microsoft BitNet b1.58: 重新定义本地化 AI 推理的性能与能效极限
人工智能
秦先生在广东8 小时前
去中心化与全能化:深入剖析 Open WebUI 的自托管架构与工程实践
人工智能
IvorySQL8 小时前
PostgreSQL 日报|堆表选择性索引更新(10 月 13 日)
数据库·人工智能·postgresql·开源·区块链
蜗牛互联网8 小时前
Java 17 调用视觉 Responses API:JSON 约束与人工复核路由
java·人工智能·后端
秦先生在广东8 小时前
Agent 驱动的逆向工程工作流:REA 全栈二进制与多格式分析工具深度解析
人工智能
2603_968817348 小时前
AI视频怎么超清增强
人工智能
frankzch8 小时前
微软 137B 编码模型搬到 PC:端侧推理与 Agent 权限防线
人工智能·深度学习·microsoft·机器学习·语言模型
TomEval8 小时前
【测AI】第11篇:深度学习基础 —— 神经网络是怎么工作的
人工智能·python·深度学习·神经网络·机器学习·aigc
老金带你玩AI8 小时前
Gemini 4上线!又回到御三家了?
人工智能