1. go语言版的Langchain - Eino(字节)

说到LLM应用开发框架,大家第一反应可能是Python圈的LangChain。确实,LangChain是这个领域的先行者,生态也非常成熟。但Eino并不是LangChain的Go翻译版–它借鉴了LangChain、GoogleADK等框架的设计理念,但整个架构是按照Go的惯例从头设计的。比如用接口来抽象组件、用强类型来做编排时的类型检查、用goroutine来实现并行编排–这些都是Go语言本身的优势,而不是硬套Python的设计模式。
用一句话概括Eino的定位:它是一个组件化、可编排、可观测的Go语言LLM应用开发框架。"组件化"意味着你可以像搭积木一样组合各种能力,“可编排"意味着你可以用Chain、Graph、Workflow三种方式把组件串联起来,"可观测"意味着从日志到链路追踪,框架层面就帮你解决了。

2. 一个简单的llm调用示例

package main

import (
	"context"
	"errors"
	"fmt"
	"github.com/cloudwego/eino-ext/components/model/openai"
	"github.com/cloudwego/eino/schema"
	"io"
	"log"
)

/**
 * 使用 ModelScope 的 OpenAI 模型
 * 一个简单的llm调用示例
 */
func main() {
	ctx := context.Background()

	model, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
		BaseURL: "https://api-inference.modelscope.cn/v1/",
		APIKey:  "xxx",   // 魔塔社区可创建key,每天有免费额度可用
		Model:   "Qwen/Qwen3.5-35B-A3B",
	})
	if err != nil {
		log.Fatalf("创建 ChatModel 失败: %v", err)
	}

	message := []*schema.Message{
		schema.SystemMessage("你是一个Go语言专家,擅长深入浅出地讲解技术概念。"),
		schema.UserMessage("请用200字左右解释 Go 语言的 channel 是什么,以及它在并发编程中的作用。"),
	}

	// 获取流式读取器
	stream, err := model.Stream(ctx, message)
	if err != nil {
		log.Fatalf("获取流式读取器失败: %v", err)
	}
	defer stream.Close()
	fmt.Println("模型回复(流式):")
	// 循环读取流式数据块
	for {
		chunk, err := stream.Recv()
		if errors.Is(err, io.EOF) {
			// 流结束
			break
		}
		if err != nil {
			log.Fatalf("读取流数据失败: %v", err)
		}
		// 每收到一块就立即输出,不换行
		fmt.Print(chunk.Content)
	}

	fmt.Println() // 最后换行
}

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐