今日学习eino框架
零、先搞清楚这是个啥?
你面前这个 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)几乎不用动。
替换步骤:
- 去目标向量库的控制台/官网注册账号,建一个 dataset(数据集)
- 在 retriever 目录下新建一个文件,比如 milvus_retriever.go
- 实现 retriever.Retriever 接口(Retrieve 方法)
- 在 rag.go 的 newVikingDBRetriever 那一行改成调你的新 retriever
- 完事,主流程代码零改动
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 分钟看一遍,比自己瞎试省一天。 |
更多推荐


所有评论(0)