Go版Agent小笔记
仓库地址,现在已经初步实现了每节课的相关功能,并且做了api调用 https://github.com/Wood-Q/SuperAgent
自研Eino-pgvector组件https://github.com/Wood-Q/Eino-pgvector
求StarStarStar🌟🌟啦!
技术选型
字节开源的AI大模型编排框架Eino+字节自己的hertz框架
RAG知识库
PGvector向量数据库
Tool Calling工具调用
MCP
ReAct Agent智能体构建
Serverless计算服务
Cursor AI代码生成+mcp
所用的包
-
Eino大模型调度 github.com/cloudwego/eino
-
Hertz HTTP框架
-
Ent ORM数据库操控
-
Viper配置库
github.com/spf13/viper
-
Zap日志库
-
swag api文档生成
github.com/swaggo/swag/cmd/swag
-
testify 测试库
-
pgvector 插件(自研,欢迎给star啊啊啊啊啊!)
本地部署大模型
ollama部署即可
Eino框架详解
概述
Eino提供了一整套的大模型编排使用所需要的组件
| 组件名 | 组件功能 |
|---|---|
| ChatModel | 与大模型交互,输入 Message 上下文,得到模型的输出 Message |
| Tool | 与世界交互,根据模型的输出,执行对应的动作 |
| Retriever | 获取相关的上下文,让模型的输出基于高质量的事实 |
| ChatTemplate | 接收外界输入,转化成预设格式的 prompt 交给模型 |
| Document Loader | 加载指定的文本 |
| Document Transformer | 按照特定规则转化指定的文本 |
| Indexer | 存储文件并建立索引,供后续 Retriever 使用 |
| Embedding | Retriever 和 Indexer 的共同依赖,文本转向量,捕获文本语义 |
| Lambda | 用户定制 function |
提供了相应的编排方式

| 编排方式 | 特点和场景 |
|---|---|
| Chain | 链式有向图,始终向前,简单。适合数据单向流动,没有复杂分支的场景。 |
| Graph | 有向图,有最大的灵活性;或有向无环图,不支持分支,但有清晰的祖先关系。 |
ChatModel使用
https://www.cloudwego.io/zh/docs/eino/core_modules/components/chat_model_guide/
根据官方文档,配置远程or本地ollama模型进行使用
Embedding使用
https://www.cloudwego.io/zh/docs/eino/core_modules/components/embedding_guide/
Embedder就是一个将文本转化为向量的组件
需要根据官方的介绍来调用不同接口实现
▼go复制代码ctx := context.Background() // 创建 embedder 配置 // 这里我使用腾讯云,因为pgvector不支持2000维度以上的向量索引 cfg := &tencentcloud.EmbeddingConfig{ SecretID: "J", SecretKey: "", } // 创建 embedder embedder, err := tencentcloud.NewEmbedder(ctx, cfg) if err != nil { panic(err) }
Loader使用
Loader就是提供了一个加载文档的组件
需要配合Transformer对文档进行处理后使用
https://www.cloudwego.io/zh/docs/eino/core_modules/components/document_loader_guide/
▼go复制代码// 初始化 loader loader, _ := file.NewFileLoader(ctx, &file.FileLoaderConfig{ UseNameAsID: true, }) // 加载文档 docs, err := loader.Load(ctx, document.Source{ URI: "document/test.md", }) if err != nil { log.Fatalf("加载文档失败: %v", err) } // 初始化分割器 splitter, err := markdown.NewHeaderSplitter(ctx, &markdown.HeaderConfig{ Headers: map[string]string{ "#": "h1", "##": "h2", "###": "h3", }, TrimHeaders: false, }) if err != nil { panic(err) } // 分割文档 docs, err = splitter.Transform(ctx, docs) if err != nil { panic(err) }
Transformer使用
主要用于文档转换和处理,适用于一下场景
- 将长文档分割成小段落以便于处理
- 根据特定规则过滤文档内容
- 对文档内容进行结构化转换
- 提取文档中的特定部分
https://www.cloudwego.io/zh/docs/eino/core_modules/components/document_transformer_guide/
这里使用markdown来操作
indexer存储使用
可以使用分割处理后文档,用作知识库检索,搭配字节官方的VikingDB火山引擎应该是最好用的
https://www.cloudwego.io/zh/docs/eino/ecosystem_integration/indexer/indexer_volc_vikingdb/
不过我想使用本地PostgreSQL数据库
- 关系型数据库现在依旧是很多企业选用的部分
- PostgreSQL的插件支持比较不错
于是自己开发了一个开源项目
https://github.com/Wood-Q/Eino-pgvector
使用这个开源项目在PostgreSQL里进行向量存储
retriever检索召回
把前面存储在向量数据库里的文档筛选召回,用于提前对大模型补充上下文
https://www.cloudwego.io/zh/docs/eino/ecosystem_integration/retriever/retriever_volc_vikingdb/
最好配合官方VikingDB使用
我还没有对pgvector开发这个功能,后续需要补充
RAG知识库
Retrieval-Augmented Generation检索知识生成
利用信息检索+知识库,对AI生成的内容进行增强
让AI生成内容之前去看小抄本,基于真实资料回答而不是凭空想象
实现
- 文档搜集和切割
- 从各个地方搜集文档
- 将文本转化为大小长度一致的片段
- 向量转换和存储
- 使用embedding模型把文本块转换为高维向量表示,可以捕捉文本的语义特征
- 把向量存储到向量数据库
- 文档过滤和检索
- 查询处理,用户问题也转化为向量
- 过滤机制:基于元数据,关键词和自定义规则进行过滤
- 相似度检索:向量数据库里找到最近似的文档块匹配
- 上下文组装:把上一步找到的文档块组装成上下文
- 查询增强和关联
- 提示词组装:检索到的文档和用户问题做提问增强
- 上下文融合:大模型基于增强提示生成回答
- 源引用:在回答里添加信息来源引用
- 后处理:格式化,摘要或其他处理以优化最终输出
向量数据库
向量数据库是专门存储和检索向量数据的知识库系统,通过高效索引算法实现快速相似性搜索,支持K近邻查询等操作
