尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
如何用 Genkit + Ollama 搭一套完全离线的文档问答:本地 RAG 实战教程
如何用 Genkit Ollama 搭一套完全离线的文档问答本地 RAG 实战教程【免费下载链接】genkitOpen-source framework for building agentic apps in JavaScript, Go, Dart, and Python, built and used in production by Google项目地址: https://gitcode.com/GitHub_Trending/ge/genkit本文基于 Genkit 仓库中的 Ollama 示例js/testapps/ollama带你接好 genkitx-ollama 插件、用 nomic-embed-text 做嵌入、内存余弦相似度检索、phi3.5 生成搭出一条完全离线的本地 RAG 问答链路并能在 Dev UI 中直接运行调试。数据出不了内网本地 RAG 为什么是首选先说结论如果你的文档不能离开内网、不想按 token 付费、或者干脆要离线可用本地 RAG 几乎是唯一务实的选择。RAGRetrieval-Augmented Generation检索增强生成的原理很简单就三步嵌入把每份文档转成一个向量。你可以把 embedding 理解成把文本变成一组可以算距离的数字检索用户问题也转成向量和文档向量比距离余弦距离越小语义越接近生成把检索出的几条文档塞进 prompt让模型基于上下文回答。Genkit 仓库里有一条现成的完整链路可以直接照着跑js/testapps/ollama示例内置了 5 条宝可梦描述Pikachu、Charmander、Bulbasaur、Squirtle、Jigglypuff用nomic-embed-text生成 768 维嵌入在内存里做余弦相似度取 Top-3再交给phi3.5:latest生成回答。除了本地跑着一个 Ollama 服务整个过程不依赖任何云端 API。一套本地环境Ollama、Node 18 与两个模型的拉取这一步要准备两样东西Node.js18 及以上版本示例基于tsx与tsc运行Ollama本地模型服务端负责嵌入和文本生成。️ 安装 Ollama 后启动服务并拉取模型ollama serve ollama pull nomic-embed-text ollama pull phi3.5:latestollama serve默认监听http://localhost:11434这个地址同时也是 Genkit Ollama 插件在未配置serverAddress时的默认值。模型角色用途nomic-embed-text嵌入模型把宝可梦描述和用户问题转成 768 维向量phi3.5:latest生成模型基于检索到的上下文产出最终回答示例的genkit与genkitx-ollama都以workspace:*形式依赖 monorepo 内的本地包见 js/testapps/ollama/package.json所以不需要单独安装插件。⚠️ 注意运行时报Make sure the Ollama server is running.时先确认ollama serve是否在跑。插件对 Ollama 的请求一旦失败就会抛出这句话见 js/plugins/ollama/src/index.ts。最小可运行配置5 行代码把 Genkit 接到 Ollama核心配置长这样完整源码见 js/testapps/ollama/src/index.tsimport { genkit, z } from genkit; import { ollama } from genkitx-ollama; const ai genkit({ plugins: [ ollama({ embedders: [{ name: nomic-embed-text, dimensions: 768 }], }), ], });插件支持的全部参数定义在 js/plugins/ollama/src/types.ts 的OllamaPluginParams中若与仓库当前版本不符以源码为准参数必填说明models否声明要注册的生成模型如[{ name: gemma }]可带type: chat \| generate默认chat和supports.toolsembedders用嵌入时必填namedimensions必须都提供初始化时注册为ollama/nameactionserverAddress否默认http://localhost:11434requestHeaders否静态对象或异步函数函数会收到{ serverAddress, model, modelRequest?, embedRequest? }适合动态注入鉴权 token示例里还额外挂了一个requestHeaders函数打印serverAddress后返回一个模拟的Authorization: Bearer头——这就是动态鉴权的标准写法把my-token换成真实 token 获取逻辑即可。引用模型和嵌入器有两个便捷函数ollama.model(phi3.5:latest) // - ModelReferenceollama/phi3.5:latest ollama.embedder(nomic-embed-text) // - ollama/nomic-embed-text它们内部只是把名字拼成ollama/name形式的 action 名。这里有个值得知道的细节生成模型是动态解析的——你本地ollama pull过任何模型都可以通过ollama.model(模型名)直接调用不必在models里声明而嵌入器必须提供dimensions所以要在embedders里显式注册。一个问题变成答案的三段路径示例把 RAG 拆成三个独立函数全部在 js/testapps/ollama/src/index.ts 中。第一段给每份文档生成嵌入pokemon.embedding ( await ai.embed({ embedder: ollama.embedder(nomic-embed-text), content: pokemon.description, }) )[0].embedding;ai.embed返回嵌入结果数组示例取[0]拿到唯一那个向量。底层行为插件把文本组装成{ model, input }请求体 POST 到 Ollama 的/api/embed再把响应里的payload.embeddings逐个包成{ embedding }返回实现见 js/plugins/ollama/src/embeddings.ts。第二段内存里算 Top-3 余弦距离findNearestPokemon的检索策略很朴素教学价值很高先做完整性校验只要还有记录的embedding是null直接抛Some Pokemon are not yet embedded对每条记录算余弦距离升序排序取前topN 3条余弦距离 1 - 点积 / (|a| × |b|)越小语义越近遇到零向量会抛Invalid input: zero vector。第三段带着上下文生成回答return await ai.generate({ model: ollama.model(phi3.5:latest), prompt: Given the following context on Pokemon:\n${pokemonContext}\n\nQuestion: ${question}\n\nAnswer:, });关键点有两个用户问题也要先过一遍嵌入模型才能和文档向量在同一语义空间里比距离检索出的 3 条记录被拼成名字: 描述的上下文块塞进 prompt。最终答案从response.text取。⚠️ 注意示例每次执行 Flow 都会对全部 5 条记录重新嵌入。演示无所谓但真实项目里文档索引应该是一次性离线任务运行时只嵌入查询语句。把 RAG 包成 Flow用 Dev UI 直接跑起来export const pokemonFlow ai.defineFlow( { name: Pokedex, inputSchema: z.string(), outputSchema: z.string(), }, async (input) { await embedPokemon(); const response await generateResponse(input); return response.text; } );inputSchema/outputSchema用 Zod 声明带来两个好处Dev UI 里有结构化的输入输出表单运行时也会做参数校验。进入js/testapps/ollama目录启动pnpm run genkit:dev再开另一个终端genkit ui:start 示例的脚本含义见 js/testapps/ollama/package.json脚本命令作用genkit:devgenkit start -- tsx --watch src/index.ts热重载运行入口由 Genkit CLI 托管devtsx --watch src/index.ts不经过 Genkit CLI 的纯开发运行buildtsc编译 TypeScript 到lib/startnode lib/index.js运行编译产物Dev UI 里能看到两个 FlowPokedex是完整的 RAG 入口输入一个自然语言问题比如问哪只宝可梦擅长电系攻击就能看到完整的检索生成链路joker则演示了两个进阶能力——运行时通过model参数动态换模型默认gemma3:latest以及用onChunk: sendChunk把ai.generate的增量片段实时转发给调用方实现流式输出。插件背后Genkit 配置与 Ollama HTTP API 的映射想把示例改造到自己的项目里搞清楚插件底层行为很有帮助。OllamaConfigSchemajs/plugins/ollama/src/index.ts在 Genkit 通用生成配置之上扩展了 Ollama 特有参数映射关系如下默认值来自插件源码描述若与仓库当前版本不符以源码为准Genkit 配置项映射到 Ollama options默认值 / 范围temperaturetemperature0.80.0 ~ 1.0topKtop_k40topPtop_p0.90 ~ 1.0stopSequencesstop多值用空串连接成一个字符串—maxOutputTokensnum_predict—也就是说ai.generate({ config: { temperature: 0.2 } })就能直接控制采样。端点选择由模型的type决定type: chat默认→POST /api/chat走多轮 messages图片会自动剥掉 data URI 前缀再发送工具调用tool_calls也只有 chat API 支持type: generate→POST /api/generateprompt 与 system 消息被分别提取到prompt/system字段。工具方面有个硬限制工具的inputSchema必须是 object 类型否则插件会抛Unsupported tool: ... Ollama only supports tools with object inputs。另外两个底层行为值得知道动态发现插件的listActions会调用 Ollama 的GET /api/tags拉取本地已装模型朴素地过滤掉名字里含 embed 的把其余模型暴露为ollama/nameaction流式读取流式请求通过res.body.getReader()逐块读取解析 Ollama 返回的 NDJSON 流后回调onChunk。动手清单把示例推向生产的 5 个改法索引与检索分离把embedPokemon()挪进一次性脚本或定时任务运行时只对查询语句做嵌入换掉内存线性扫描数据量上来后接向量存储仓库里已有 js/plugins/pinecone/、js/plugins/dev-local-vectorstore/ 等插件可参考换模型零成本ollama pull新模型后在插件配置的models/embedders里声明即可业务代码不用动调采样参数在ai.generate的config里传temperature/topK/topP按问题类型收紧或放松输出用 Dev UI 盯召回质量跑Pokedex时查看每个节点的输入输出与耗时定位是检索召回不准还是生成质量差。【免费下载链接】genkitOpen-source framework for building agentic apps in JavaScript, Go, Dart, and Python, built and used in production by Google项目地址: https://gitcode.com/GitHub_Trending/ge/genkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

【计算机毕业设计单片机案例】基于 STM32 的室内烟雾 PM2.5 监测联动排风报警系统设计 基于 STM32 的本地多模式环境调控与远程数据查看系统设计(010309)

【计算机毕业设计单片机案例】基于 STM32 的室内烟雾 PM2.5 监测联动排风报警系统设计 基于 STM32 的本地多模式环境调控与远程数据查看系统设计(010309)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

📅 2026/9/24 13:54:58
【Coze】【视频】书单诗词工作流

【Coze】【视频】书单诗词工作流

今天给大家演示一个 书单诗词 Coze 工作流。这个工作流将文本生成、语音合成与视频排版紧密结合,通过大模型抽取书籍中的精彩金句,再配合音频与画面合成,实现从文字到短视频的一键式自动化创作。无论是读书博主、诗词爱好者,还是想要快速生成内容的创作者,都能借助该流程高…

📅 2026/9/24 13:49:58
【Coze】【视频】每日英语工作流No.1

【Coze】【视频】每日英语工作流No.1

今天给大家演示一个 Coze 每日英语学习工作流。它通过调用大模型来生成英语知识点与例题,再结合数据整理与可视化排版,让学习者每天都能获得一个完整的英语练习包。该流程涵盖了从知识点生成、数据结构化处理,到可视化例题展示的完整闭环,帮助用户在学习中既能掌握知识要点…

📅 2026/9/24 13:49:58
MORE NEWS

更多资讯

📰

Dopamine 中 PPO Agent 的 JAX 实现:从 PPOAgent 源码到 gin 配置实战

Dopamine 中 PPO Agent 的 JAX 实现:从 PPOAgent 源码到 gin 配置实战 【免费下载链接】dopamine Dopamine is a research framework for fast prototyping of reinforcement learning algorithms. 项目地址: https://gitcode.com/gh_mirrors/do/dopamine 导…

📰

G6 History 历史记录插件完全指南:为图编辑实现撤销(Undo)与重做(Redo)

数据可视化前端图表库 【免费下载链接】G6 ♾ A Graph Visualization Framework in JavaScript. 项目地址: https://gitcode.com/gh_mirrors/g6/G6 点击查看 免费下载 导读 History 是 G6 图可视化框架内置的官方插件,专门为图编辑场景提供 撤销&#…

📰

SQL Server Optimized Locking 实战:Transaction ID (TID) 锁定内部机制解析

示例工程数据库教程后端 【免费下载链接】sql-server-samples Azure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge 项目地址: https://gitcode.com/gh_mirrors…

📰

ToastFish 完整指南:用 Windows 通知栏背单词

ToastFish 完整指南:用 Windows 通知栏背单词 【免费下载链接】ToastFish 一个利用摸鱼时间背单词的软件。 项目地址: https://gitcode.com/GitHub_Trending/to/ToastFish ToastFish 是一款开源的背单词软件,它把单词卡片通过 Windows 系统通知推…

📰

AIGC运镜逻辑:推镜头到底怎么推?

推镜头,说穿了就是机器朝目标走。主体越来越大,背景被挤出画外。这个动作太符合直觉:想看清什么,凑近就完了。也正因为太直觉,很多人把它当“画面放大”用。写一句“推镜头”就交差。生成出来一看:镜头是动…

📰

Quick 测试框架 CocoaPods 安装问题排查:“No such module ‘Quick‘“ 报错的完整解决方案

测试开发工具 【免费下载链接】Quick The Swift (and Objective-C) testing framework. 项目地址: https://gitcode.com/gh_mirrors/qu/Quick 点击查看 免费下载 Quick 是基于行为驱动开发(BDD)风格的 Swift 与 Objective-C 测试框架&#x…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬