零、先搞清楚这是个啥?

你面前这个 chatwitheino 项目,本质就是一个 AI 聊天界面。跟你在网页上跟豆包/ChatGPT 聊天差不多,但这个是你自己部署的,可以接入你自己的数据。

它能做两件事:

  • 普通聊天:你问啥它答啥(依赖 .env 配的大模型)
  • 聪明聊天:让它先翻你公司的资料/文档,再回答(这就是 RAG 检索增强生成)

咱们这次要干的就是:把 RAG(让它能看自家文档)给接上。

一、先把大模型配好(.env 文件)

.env 文件就是"项目配置表",告诉程序去用哪个 AI、密钥是啥。

你这个 .env 已经写好了,内容大致是:

.env 配置(参考)

MODEL_TYPE=ark

ARK_API_KEY=你的豆包API密钥

ARK_MODEL=doubao-pro-32k(之类的)

ARK_BASE_URL=火山引擎豆包的接口地址

PORT=8080

MESSAGE_KIND=...

下面挨个解释每行是啥意思:

配置项

意思(说人话)

MODEL_TYPE=ark

告诉程序:我要用火山引擎的豆包大模型(ark 是豆包的服务代号)

ARK_API_KEY

你的豆包 API 密钥,相当于账号密码(去火山引擎控制台申请)

ARK_MODEL

具体用哪个模型,比如 doubao-pro-32k、doubao-lite 等,越大越强但越贵

ARK_BASE_URL

API 服务器地址。一般是 https://ark.cn-beijing.volces.com/api/v3

PORT=8080

网页服务跑在 8080 端口,访问 http://localhost:8080 就能用

MESSAGE_KIND

消息格式类型,按需设置(不用改也能跑)

��

如果不确定怎么填,去火山引擎控制台 → 在线推理 → 创建 API Key → 复制下来填进去。

MODEL_TYPE 暂时只能写 ark,因为 eino 示例工程目前只接了火山引擎这一种。

二、什么是 RAG?为啥要接它?

RAG 全称 Retrieval-Augmented Generation(检索增强生成),翻译成人话就是:

"回答之前先去翻一翻你的资料,翻到相关内容再编答案"。

举个例子:

  • 没接 RAG:AI 只能答它训练时学过的知识,问它你们公司今年新规它肯定不知道
  • 接了 RAG:你把公司文档提前塞进向量库,问的时候 AI 先去库里找相关内容,再基于找到的内容回答

��

RAG 工作流程(记住这个就够):用户问题 → 把问题转成数字(向量) → 去向量库搜最像的资料 → 把资料和问题一起喂给大模型 → 大模型生成最终答案

三、向量数据库是啥?我现在用哪个?

向量数据库 = 专门存"数字串"(向量)的数据库

普通数据库存的是文字、数字;向量数据库存的是一长串浮点数(比如 [0.12, 0.88, -0.45, ...]),这些数字代表了"某段文字的含义"。意思相近的文本,对应的数字也相近。

你现在用的是:火山引擎 VikingDB

这是火山引擎提供的云服务版本向量数据库,已经在 rag/vikingdb_v2_retriever.go 里接好了。它的优点是:

  • 跟豆包大模型是同一家的,配合默契
  • 不需要自己买服务器,开箱即用
  • 内置 embedding 模型,连 bge-m3 都不用自己部署

缺点:

  • 得花钱(按调用量计费)
  • 数据存在别人服务器上,敏感场景需要看合规
  • 目前 SDK 对 V1/V2 数据集兼容性有点坑(参考改造笔记)

四、还能换成别的吗?

当然能!VikingDB 只是个选,不是唯一。下面是常见替代方案,按"上手难度"和"费用"排:

数据库

类型

上手难度

费用

适合谁

火山引擎 VikingDB

云服务

★★

付费(火山云)

已经在用火山引擎、追求稳

阿里云 DashVector

云服务

★★

付费(阿里云)

在阿里云上做项目

腾讯云 VectorDB

云服务

★★

付费(腾讯云)

在腾讯云上做项目

百度 VectorDB

云服务

★★

付费(百度云)

在百度云上做项目

Milvus

开源(自建)

★★★

免费(自己扛服务器)

公司内部、数据量超大

Qdrant

开源(可自建可云)

★★

有免费版

想免费又有官方托管

Weaviate

开源(可自建可云)

★★★

有免费版

想用上现成模块

Chroma

开源(嵌入进程)

免费

学习、demo、小项目

pgvector

PostgreSQL 插件

★★

免费

已经在用 PG 数据库

LanceDB

开源(嵌入进程)

免费

本地开发、轻量场景

Pinecone

海外云服务

付费

海外项目、网络好

4.1 怎么换?

好消息:eino 的 retriever 设计是接口化的,你换库只改 retriever 实现,上层代码(rag.go)几乎不用动。

替换步骤:

  1. 去目标向量库的控制台/官网注册账号,建一个 dataset(数据集)
  2. 在 retriever 目录下新建一个文件,比如 milvus_retriever.go
  3. 实现 retriever.Retriever 接口(Retrieve 方法)
  4. 在 rag.go 的 newVikingDBRetriever 那一行改成调你的新 retriever
  5. 完事,主流程代码零改动

4.2 我该选哪个?

给你一个粗暴的选法:

  • 本地学习、跑 demo → 选 Chroma 或 LanceDB(无需任何账号、装好即用)
  • 公司项目、有自己的 PG 数据库 → 选 pgvector(少加一个组件)
  • 公司项目、想用专业的 → 选 Milvus 或 Qdrant(功能强、生态全)
  • 已经在用某个云(阿里/腾讯/百度/火山)→ 选该云自家的向量库(走内网、快、账单好算)

五、启动起来试试!

配置好之后,按这个顺序启动:

步骤

命令 / 操作

1. 进项目目录

cd quickstart/chatwitheino

2. 确认 .env 在

ls -la .env  (Windows 用 dir)

3. 装依赖

go mod tidy

4. 启动服务

go run main.go  (或你项目里的入口)

5. 打开浏览器

访问 http://localhost:8080

6. 测试 RAG

上传一个文档,问个跟文档相关的问题

⚠️

如果启动报错说"找不到 chatwitheino",八成是 .env 没读对——确认 .env 跟 main.go 在同一个目录。

六、踩过的坑(FAQ)

Q1:报"This collection was created by API V2"错误

你用 V1 SDK 去访问 V2 创建的数据集。解决方案参考项目里的 vikingdb_v2_retriever.go(已经是 V2 实现)。

Q2:报"ak/sk invalid"错误

API Key 填错了,或者跟模型不匹配。重新去火山引擎控制台复制一遍,注意区分大小写。

Q3:能聊天但 RAG 检索不到内容

你的向量库是空的——还没把文档塞进去。rag.go 里有 BuildTool 入口,需要先往 VikingDB 里导入文档。

或者:你问的问题跟你塞的文档不是一回事,AI 自然答不上来。

Q4:能搜到但回答得很奇怪

可能是 TopK(返回几条)设得太小或太大。

  • 太小:信息不够,AI 瞎编
  • 太大:上下文太长,AI 注意力分散

建议从 3-5 起步试试。

Q5:报错 "context deadline exceeded"

HTTP 超时了。如果是首次连接慢,把 ConnectionTimeout 调大点。

七、实现效果

目前用的是一个 LanceDB 风格的本地向量检索引擎

八、想深入看?去这些地方

eino 官方文档:

https://www.cloudwego.cn/zh/docs/eino/quick_start/chapter_01_chatmodel_and_message/

这一篇专门讲"如何把 ChatModel 和 Message 接起来",是接入任何大模型的标准参考。里面讲了:

  • 怎么用 NewChatModel 工厂方法创建模型实例
  • 怎么用 schema.Message 表示一条消息
  • 流式输出怎么搞
  • 如何处理工具调用(Tool Call)

你这次的项目里 chatwitheino 模块就是用这里的接口封装的。

其他值得收藏的链接:

  • eino GitHub 仓库:https://github.com/cloudwego/eino
  • eino-ext 扩展组件(含 retriever 实现):https://github.com/cloudwego/eino-ext
  • 火山引擎 VikingDB 文档:https://www.volcengine.com/docs/84313
  • 豆包大模型 API 文档:https://www.volcengine.com/docs/82379

八、一句话总结

��

1. .env 配好大模型和端口(豆包火山)

2. 向量库用 VikingDB(也可换别的)

3. rag.go 已经把 Retriever 接到工作流里,主流程不用改

4. go run 起来,浏览器开 8080,上传文档就能问

记不住没关系——本文档 5 分钟看一遍,比自己瞎试省一天。

Logo

AtomGit AI 社区提供模型库、数据集、Agent、Token等资源

更多推荐