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

所用的包

  1. Eino大模型调度 github.com/cloudwego/eino

  2. Hertz HTTP框架

    github.com/cloudwego/hertz

  3. Ent ORM数据库操控

    entgo.io/ent/cmd/ent

  4. Viper配置库

    github.com/spf13/viper

  5. Zap日志库

    go.uber.org/zap

  6. swag api文档生成

    github.com/swaggo/swag/cmd/swag

  7. testify 测试库

    github.com/stretchr/testify

  8. pgvector 插件(自研,欢迎给star啊啊啊啊啊!)

    https://github.com/Wood-Q/Eino-pgvector

本地部署大模型

ollama部署即可

Eino框架详解

概述

Eino提供了一整套的大模型编排使用所需要的组件

组件名组件功能
ChatModel与大模型交互,输入 Message 上下文,得到模型的输出 Message
Tool与世界交互,根据模型的输出,执行对应的动作
Retriever获取相关的上下文,让模型的输出基于高质量的事实
ChatTemplate接收外界输入,转化成预设格式的 prompt 交给模型
Document Loader加载指定的文本
Document Transformer按照特定规则转化指定的文本
Indexer存储文件并建立索引,供后续 Retriever 使用
EmbeddingRetriever 和 Indexer 的共同依赖,文本转向量,捕获文本语义
Lambda用户定制 function

提供了相应的编排方式 image.png

编排方式特点和场景
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数据库

  1. 关系型数据库现在依旧是很多企业选用的部分
  2. 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生成内容之前去看小抄本,基于真实资料回答而不是凭空想象

实现

  1. 文档搜集和切割
    1. 从各个地方搜集文档
    2. 将文本转化为大小长度一致的片段
  2. 向量转换和存储
    1. 使用embedding模型把文本块转换为高维向量表示,可以捕捉文本的语义特征
    2. 把向量存储到向量数据库
  3. 文档过滤和检索
    1. 查询处理,用户问题也转化为向量
    2. 过滤机制:基于元数据,关键词和自定义规则进行过滤
    3. 相似度检索:向量数据库里找到最近似的文档块匹配
    4. 上下文组装:把上一步找到的文档块组装成上下文
  4. 查询增强和关联
    1. 提示词组装:检索到的文档和用户问题做提问增强
    2. 上下文融合:大模型基于增强提示生成回答
    3. 源引用:在回答里添加信息来源引用
    4. 后处理:格式化,摘要或其他处理以优化最终输出
image2.png

向量数据库

向量数据库是专门存储和检索向量数据的知识库系统,通过高效索引算法实现快速相似性搜索,支持K近邻查询等操作

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP