From a85ad8447fe1e82e7961ba856df3cfcee0ec38e3 Mon Sep 17 00:00:00 2001 From: Docker7530 <121306237+Docker7530@users.noreply.github.com> Date: Wed, 11 Mar 2026 22:39:26 +0800 Subject: [PATCH] 1773239962 --- .../plugins/recent-files-obsidian/data.json | 204 +++++------ .obsidian/workspace.json | 66 ++-- .../images-paste/image-20260304153545122.png | Bin 32377 -> 0 bytes calendar/diary/2026-03-10.md | 25 +- calendar/diary/2026-03-11.md | 38 ++ calendar/diary/2026-03-12.md | 8 + .../前端/如何成为一个 React 工程师呢?.md | 51 ++- work/移动杭研/AI 项目/CLAUDE.md.md | 31 ++ .../AI 项目/IBS 智能体具体落实技术方案.md | 2 - work/移动杭研/AI 项目/RAG Flow 部署.md | 324 ++++++++++++++++++ work/移动杭研/AI 项目/RAG Flow.md | 29 ++ work/移动杭研/AI 项目/settings.local.json.md | 30 ++ work/移动杭研/AI 项目/开发备注.md | 14 + 13 files changed, 680 insertions(+), 142 deletions(-) delete mode 100644 attachment/images-paste/image-20260304153545122.png create mode 100644 calendar/diary/2026-03-11.md create mode 100644 calendar/diary/2026-03-12.md create mode 100644 work/移动杭研/AI 项目/CLAUDE.md.md create mode 100644 work/移动杭研/AI 项目/RAG Flow 部署.md create mode 100644 work/移动杭研/AI 项目/RAG Flow.md create mode 100644 work/移动杭研/AI 项目/settings.local.json.md create mode 100644 work/移动杭研/AI 项目/开发备注.md diff --git a/.obsidian/plugins/recent-files-obsidian/data.json b/.obsidian/plugins/recent-files-obsidian/data.json index f99f29f..210e684 100644 --- a/.obsidian/plugins/recent-files-obsidian/data.json +++ b/.obsidian/plugins/recent-files-obsidian/data.json @@ -1,13 +1,117 @@ { "recentFiles": [ + { + "basename": "CLAUDE.md", + "path": "work/移动杭研/AI 项目/CLAUDE.md.md" + }, + { + "basename": "常用命令", + "path": "resource/常用命令.md" + }, + { + "basename": "settings.local.json", + "path": "work/移动杭研/AI 项目/settings.local.json.md" + }, + { + "basename": "服务器-香港", + "path": "personal/服务器-香港.md" + }, + { + "basename": "20260311142461", + "path": "000-Inbox/20260311142461.md" + }, + { + "basename": "K-V 功能", + "path": "work/移动杭研/项目备忘/K-V 功能.md" + }, + { + "basename": "IBS NG 日志模板", + "path": "work/移动杭研/项目备忘/IBS NG 日志模板.md" + }, + { + "basename": "项目杂记", + "path": "work/移动杭研/项目备忘/项目杂记.md" + }, + { + "basename": "数据库信息", + "path": "work/移动杭研/项目备忘/数据库信息.md" + }, + { + "basename": "获取企业 token 脚本", + "path": "work/移动杭研/项目备忘/获取企业 token 脚本.md" + }, + { + "basename": "环境账号", + "path": "work/移动杭研/项目备忘/环境账号.md" + }, + { + "basename": "工作账号", + "path": "work/移动杭研/项目备忘/工作账号.md" + }, + { + "basename": "开发备注", + "path": "work/移动杭研/AI 项目/开发备注.md" + }, { "basename": "IBS 智能体具体落实技术方案", "path": "work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md" }, + { + "basename": "RAG Flow", + "path": "work/移动杭研/AI 项目/RAG Flow.md" + }, { "basename": "ibs-ai 项目梳理", "path": "work/移动杭研/AI 项目/ibs-ai 项目梳理.md" }, + { + "basename": "20260311083458", + "path": "000-Inbox/20260311083458.md" + }, + { + "basename": "20260311084236", + "path": "000-Inbox/20260311084236.md" + }, + { + "basename": "20260311090483", + "path": "000-Inbox/20260311090483.md" + }, + { + "basename": "20260311100356", + "path": "000-Inbox/20260311100356.md" + }, + { + "basename": "如何成为一个 React 工程师呢?", + "path": "resource/前端/如何成为一个 React 工程师呢?.md" + }, + { + "basename": "RAG Flow 部署", + "path": "work/移动杭研/AI 项目/RAG Flow 部署.md" + }, + { + "basename": "20260310144341", + "path": "000-Inbox/20260310144341.md" + }, + { + "basename": "20260310150987", + "path": "000-Inbox/20260310150987.md" + }, + { + "basename": "20260310142396", + "path": "000-Inbox/20260310142396.md" + }, + { + "basename": "20260310104243", + "path": "000-Inbox/20260310104243.md" + }, + { + "basename": "获取各省试商用详情(已无法使用)", + "path": "work/移动杭研/业务梳理/业务工单/获取各省试商用详情(已无法使用).md" + }, + { + "basename": "0223-试商用峰值带宽为什么查不到红象公司22", + "path": "work/移动杭研/问题处理/2024-02/0223-试商用峰值带宽为什么查不到红象公司22.md" + }, { "basename": "图纸-IBS 智能体-v3-项目架构", "path": "work/移动杭研/AI 项目/图纸-IBS 智能体-v3-项目架构.md" @@ -36,14 +140,6 @@ "basename": "20260309150326", "path": "000-Inbox/20260309150326.md" }, - { - "basename": "如何成为一个 React 工程师呢?", - "path": "resource/前端/如何成为一个 React 工程师呢?.md" - }, - { - "basename": "服务器-香港", - "path": "personal/服务器-香港.md" - }, { "basename": "直播源", "path": "personal/电影/直播源.md" @@ -72,14 +168,6 @@ "basename": "Ubuntu 24.04 LTS ELK 8 安装指南", "path": "resource/组件/Ubuntu 24.04 LTS ELK 8 安装指南.md" }, - { - "basename": "常用命令", - "path": "resource/常用命令.md" - }, - { - "basename": "环境账号", - "path": "work/移动杭研/项目备忘/环境账号.md" - }, { "basename": "开发笔记", "path": "work/移动杭研/开发记录/7.19.0/开发笔记.md" @@ -111,90 +199,6 @@ { "basename": "vim 快捷键与操作手册", "path": "resource/系统/vim 快捷键与操作手册.md" - }, - { - "basename": "VSCode 配置文件", - "path": "resource/配置/VSCode 配置文件.md" - }, - { - "basename": "Rime 配置文件", - "path": "resource/配置/Rime 配置文件.md" - }, - { - "basename": "PowerShell 配置文件", - "path": "resource/配置/PowerShell 配置文件.md" - }, - { - "basename": "Codex 配置文件", - "path": "resource/配置/Codex 配置文件.md" - }, - { - "basename": "Claude Code 提示词", - "path": "resource/配置/Claude Code 提示词.md" - }, - { - "basename": "Claude Code 配置文件", - "path": "resource/配置/Claude Code 配置文件.md" - }, - { - "basename": "19 家顶级 Web3 投资机构简介丨 Web3 创业者必看", - "path": "resource/剪藏/理财相关/19 家顶级 Web3 投资机构简介丨 Web3 创业者必看.md" - }, - { - "basename": "jar 包启动脚本", - "path": "resource/脚本/jar 包启动脚本.md" - }, - { - "basename": "数据清洗-日志筛选", - "path": "resource/脚本/数据清洗-日志筛选.md" - }, - { - "basename": "轮询备案号(GO)", - "path": "resource/脚本/轮询备案号(GO).md" - }, - { - "basename": "Rime YAML Custom Patch 语法笔记", - "path": "resource/工具/rime/Rime YAML Custom Patch 语法笔记.md" - }, - { - "basename": "Rime 小狼毫", - "path": "resource/工具/rime/Rime 小狼毫.md" - }, - { - "basename": "x-callback-url", - "path": "resource/工具/obsidian/x-callback-url.md" - }, - { - "basename": "Templater", - "path": "resource/工具/obsidian/Templater.md" - }, - { - "basename": "阅读记录", - "path": "personal/阅读/阅读记录.md" - }, - { - "basename": "装机系统", - "path": "personal/个人/装机系统.md" - }, - { - "basename": "装机历程", - "path": "personal/个人/装机历程.md" - }, - { - "basename": "债务记录", - "path": "personal/个人/债务记录.md" - }, - { - "basename": "日常记录", - "path": "personal/个人/日常记录.md" - }, - { - "basename": "情绪价值", - "path": "personal/个人/情绪价值.md" - }, - { - "basename": "结婚相关", - "path": "personal/个人/结婚相关.md" } ], "omittedPaths": [ diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 8b0c9cd..9bba418 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -4,22 +4,17 @@ "type": "split", "children": [ { - "id": "4b5820367a78b7bd", + "id": "ba67f7f262d91fde", "type": "tabs", "children": [ { - "id": "4695be4ed62c6a04", + "id": "08db0b367836cf1d", "type": "leaf", "state": { - "type": "markdown", - "state": { - "file": "work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md", - "mode": "source", - "source": false, - "backlinks": false - }, + "type": "empty", + "state": {}, "icon": "lucide-file", - "title": "IBS 智能体具体落实技术方案" + "title": "新标签页" } } ] @@ -97,7 +92,7 @@ } ], "direction": "horizontal", - "width": 507.5 + "width": 253.5 }, "right": { "id": "ca733f6d5936ae40", @@ -114,13 +109,12 @@ "state": { "type": "outline", "state": { - "file": "work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md", "followCursor": true, "showSearch": false, "searchQuery": "" }, "icon": "lucide-list", - "title": "IBS 智能体具体落实技术方案 的大纲" + "title": "大纲" } }, { @@ -232,34 +226,34 @@ "obsidian-excalidraw-plugin:New drawing": false } }, - "active": "4695be4ed62c6a04", + "active": "08db0b367836cf1d", "lastOpenFiles": [ - "work/移动杭研/AI 项目/ibs-ai 项目梳理.md", - "work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md", - "work/移动杭研/AI 项目/MCP Prompt.md", - "work/移动杭研/AI 项目/图纸-IBS 智能体-v3-项目架构.md", - "work/移动杭研/AI 项目/图纸-IBS 智能体-v2-项目架构 原生 MCP.md", - "work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo 对象存储.md", - "work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo.md", - "work/移动杭研/AI 项目/IBS 智能体-v4.md", - "work/移动杭研/AI 项目/IBS 智能体-v3-遗弃.md", - "resource/ai/prompts/Prompt 公司智能体.md", + "work/移动杭研/AI 项目/CLAUDE.md.md", + "calendar/diary/2026-03-12.md", + "calendar/diary/2026-03-11.md", "calendar/diary/2026-03-10.md", - "000-inbox/20260309173243.md", - "000-inbox/20260309150326.md", "calendar/diary/2026-03-09.md", - "calendar/diary/2026-03-08.md", - "calendar/weeks/2026-W10.md", - "calendar/diary/2026-03-07.md", "calendar/diary/2026-03-06.md", - "calendar/diary/2026-03-05.md", - "calendar/diary/2026-03-04.md", - "calendar/diary/2026-03-03.md", - "calendar/diary/2026-03-02.md", - "000-Inbox/20260309173243.md", - "000-Inbox/20260309150326.md", - "resource/前端/如何成为一个 React 工程师呢?.md", + "resource/常用命令.md", + "work/移动杭研/AI 项目/settings.local.json.md", "personal/服务器-香港.md", + "000-inbox/20260311142461.md", + "000-Inbox/20260311141403.md", + "000-Inbox/20260311145376.md", + "000-inbox/20260311145376.md", + "000-Inbox/20260311142461.md", + "work/移动杭研/项目备忘/K-V 功能.md", + "work/移动杭研/项目备忘/IBS NG 日志模板.md", + "work/移动杭研/项目备忘/项目杂记.md", + "work/移动杭研/项目备忘/数据库信息.md", + "work/移动杭研/项目备忘/获取企业 token 脚本.md", + "work/移动杭研/项目备忘/环境账号.md", + "work/移动杭研/项目备忘/工作账号.md", + "000-inbox/20260311141403.md", + "work/移动杭研/AI 项目/开发备注.md", + "work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md", + "work/移动杭研/AI 项目/RAG Flow.md", + "work/移动杭研/AI 项目/ibs-ai 项目梳理.md", "resource/工具/rime", "attachment/images-paste/image-20260304153545122.png", "work/移动杭研/开发记录/7.19.0", diff --git a/attachment/images-paste/image-20260304153545122.png b/attachment/images-paste/image-20260304153545122.png deleted file mode 100644 index c9f53b7a73a9d498c34a7f6bf47827aef3aeafec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32377 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 Uj7#7z<-f7HfcT~S{LKgd3*7jxQvd(} diff --git a/calendar/diary/2026-03-10.md b/calendar/diary/2026-03-10.md index 8b80bf2..482af34 100644 --- a/calendar/diary/2026-03-10.md +++ b/calendar/diary/2026-03-10.md @@ -1,9 +1,30 @@ # 任务 - [x] 开发:参加 IBS 项目晨会,同步昨日问题跟进事项。(李春良 0.5) -- [ ] 开发:梳理 IBS V7.19.0 需求。(新业务平面引入与系统集成实施 李春良 4) -- [ ] 项目:IBS 智能体具体落实技术方案调研。(李春良 3) +- [x] 开发:开发 IBS V7.19.0 需求。(新业务平面引入与系统集成实施 20% 李春良 2) +- [x] 项目:IBS 智能体具体落实技术方案调研,文档编写。(李春良 5) +- [x] 项目:试商用客户峰值带宽(企业)导出匹配 ID。(李春良 0.5) # 日志 +帮我把数据梳理为一个markdown表格,不可以动数据。就是做到 markdown表格。每个属性都要。直接输出表格。 + +你好,想请教一个使用场景。 + +因为我们的 MCP 服务会做一些实际的业务 HTTP 请求,所以我们期望把最外层的用户 token,或者是 MCP 的自定义 token 透传给这个 MCP server。请问这个有什么比较好的实现方式吗? + +另外,我发现目前系统自带的 MCP Config 是一个静态配置,有什么比较好的方案可以实现动态检索工具呢? + +万分感谢! + # 总结 + +AI 开发,今天测试了 MCP 的调用。 + +今天和龙哥聊天,发现自己是一种和善的人格,比如龙哥说,京东、美团导致大部分普通人没有工作。 + +我发先我的思维一致是相反的,我认为大厂在某一定程度上是给社会带来了好处的,加快了社会的发展。、 + +但是想想确实,自己无论如何的成长学习,感觉和他们的差距越来越大,层级和周边人的影响是再试太大了。 + +自从换了输入法,自己的打字的速度实在是太慢了。总感觉右手不是很舒服。 diff --git a/calendar/diary/2026-03-11.md b/calendar/diary/2026-03-11.md new file mode 100644 index 0000000..3a8f3b6 --- /dev/null +++ b/calendar/diary/2026-03-11.md @@ -0,0 +1,38 @@ +# 任务 + +- [x] 开发:参加 IBS 项目晨会,同步昨日问题跟进事项。(李春良 0.5) +- [x] 开发:梳理 IBS V7.19.0 需求。(新业务平面引入与系统集成实施 30% 李春良 2) +- [x] 项目:IBS 智能体具体落实技术方案调研,打通流程。(李春良 5) + +# 日志 + +当前项目是我们的 MCP 注册中心,相当于我们提供了一个统一的 MCP 服务。我们为用户和管理员提供了一个 API 注册接口,当管理员把接口规范传给我们后,我们就可以直接为 AI 提供标准化的 MCP 接口。 + +现在遇到的一个问题是,我们想把这个注册中心给不同的平台用户使用(比如 IBS 用户、CDN 项目组等)。由于有多个项目组,且每个项目组都有自己的工具,如何有效区分这些工具成了关键。 + +请帮我调研一下: + +1. MCP 协议层面是否支持根据不同的用户 Key 返回不同的工具? +2. 针对这种需求,目前市面上是否有比较成熟的实现方案(最好是符合我们项目的技术栈)? + +总的来说,我想把它接入到一个智能体中,让不同的用户平台根据自己的 Key 获取对应的工具,这样也能减轻上下文的压力。请帮我调研一下,然后我们再讨论出一个成熟的技术方案。 + +现在进一步解决我的问题,MCP 的鉴权已经通了,如上边说的当前项目是我们的 MCP 注册中心,相当于我们提供了一个统一的 MCP 服务。我们为用户和管理员提供了一个 API 注册接口,当管理员把接口规范传给我们后,我们就可以直接为 AI 提供标准化的 MCP 接口。 + +此时有个问题了。如果各个平台有自己的鉴权的话,如何能把 token 透传下去呢?因为这个 token 可能是各个项目自己用来横向鉴权的,比如控制谁能查哪些域名等等场景。是不是可以给 mcp 增加额外的 header 然后增加到 mcp 发起调用的 header 中。帮我调研一个可行的,标准的方案。 + +# 总结 + +今天突破了 ibs-ai-mcp 项目的进展,目前实现了 token 的透传。算是实现了整个流程必要的一环。 + +下午在公司内展示了 cosmic 拆分工具的使用,再次回头看这个工具的整体设计,感觉自己有进步了,在最近学习了智能体的开发。 + +我个人认为智能体开发,前端技能目前来说是必要的。 + +晚上听了卡兹克的直播,感觉自己还是没有在小的前沿,自己过于关注比如账号注册的用户名等等这些无用的东西。感觉这些人真的比想想中年轻,对 AI 的拥抱程度。在看看周边的人,感觉对 AI 的拥抱程度真的好低呀。简直不是在一个层级。目前还在 AI 对话的形态。 + +在当下这个热潮中,周末还是有必要玩儿一下龙虾。 + +田宝和 AI 聊了好久。感觉可以把 AI 融入到我的生活中。 + +我们不应该评判是否是 AI 产出的,要看最终的内容是否是我们想要的。 diff --git a/calendar/diary/2026-03-12.md b/calendar/diary/2026-03-12.md new file mode 100644 index 0000000..ecc10c7 --- /dev/null +++ b/calendar/diary/2026-03-12.md @@ -0,0 +1,8 @@ +# 任务 + +- [ ] 开发:参加 IBS 项目晨会,同步昨日问题跟进事项。(李春良 0.5) +- [ ] 开发:梳理 IBS V7.19.0 需求。(新业务平面引入与系统集成实施 30% 李春良 2) + +# 日志 + +# 总结 diff --git a/resource/前端/如何成为一个 React 工程师呢?.md b/resource/前端/如何成为一个 React 工程师呢?.md index dfb693b..21a632d 100644 --- a/resource/前端/如何成为一个 React 工程师呢?.md +++ b/resource/前端/如何成为一个 React 工程师呢?.md @@ -144,7 +144,7 @@ export default FunctionalCounter # 第二章 组件化开发核心 -Props 通信 +Props 通信(只读的,子组件不可以进行修改,单向数据流。) ```tsx type Props = { @@ -163,12 +163,59 @@ export default PrintNmae ``` -传参 +普通传参 ```tsx ``` +children 传参,这里 type + +```tsx +import React from 'react' + +type CardProps = React.PropsWithChildren<{}> + +const Card = ({ children }: CardProps) => { + return ( +
+ {children} +
+ ) +} + +export default Card +``` + +关于 `{ children }: CardProps` 是组件接收一个 props 然后从里边结构出来 children + +类型声明: + +```tsx +type UserProps = { + name: string + age: number + isVerified: boolean + hobbies?: string[] +} + +export const User = (user: UserProps) => { + const { name, age, isVerified, hobbies } = user + + return ( +
+

{name}

+

Age: {age}

+

校验: {isVerified ? '已验证' : '未验证'}

+ {hobbies && hobbies.length > 0 &&

爱好: {hobbies.join(', ')}

} +
+ ) +} + +``` + # CSS 顶级作用域 diff --git a/work/移动杭研/AI 项目/CLAUDE.md.md b/work/移动杭研/AI 项目/CLAUDE.md.md new file mode 100644 index 0000000..515dfa5 --- /dev/null +++ b/work/移动杭研/AI 项目/CLAUDE.md.md @@ -0,0 +1,31 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +本文件用于指导 Claude Code(claude.ai/code)在此仓库中开展工作。 + +## 技术栈 + +- Java:`21`(``) +- 后端框架:Spring Boot `4.0.3` +- 后端框架:Spring Ai `1.1.2` + +## 开发规范 + +如果涉及改动对外提供的 RESTful API 需对 MCP 动态工具管理 API 文档进行及时更新。 + +开发 MCP 相关功能需要遵守 MCP 协议说明。 + +## 日志和注释 + +- 日志和注释使用中文 +- 关键位置须有日志,日志级别仅需要 `info` 和 `error` 两个级别 +- public 方法必须提供注释说明,关键位置也可以适量增加注释说明 + +## 测试规范(强约束) + +- 新增功能、修复问题、修改业务行为:必须新增/更新对应的测试用例(优先单元测试),覆盖核心规则与边界条件 +- 修复 Bug:必须提供回归测试(修复前失败、修复后通过) +- 纯代码格式/注释调整:可以不新增测试,但必须确保现有测试全部通过 +- 必要时才写集成测试(如持久化/序列化/校验):控制数量,避免把所有测试都写成 `@SpringBootTest` +- 提交前必须在仓库根目录运行 `mvn test` 并确保全部通过;测试未通过禁止提交 diff --git a/work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md b/work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md index 83ce0dd..c8f7a7f 100644 --- a/work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md +++ b/work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md @@ -89,8 +89,6 @@ dify API 的研究。 DeepSeek-R1-Distill-Qwen-32B 工具调用。 -![](../../../attachment/images-paste/image-20260304153545122.png) - 发指令 --》ibs-ai --> RAGflow --> 智能决策 a 工具 b 知识库 需要 MCP server Token 和 用户 Token。 diff --git a/work/移动杭研/AI 项目/RAG Flow 部署.md b/work/移动杭研/AI 项目/RAG Flow 部署.md new file mode 100644 index 0000000..f580e80 --- /dev/null +++ b/work/移动杭研/AI 项目/RAG Flow 部署.md @@ -0,0 +1,324 @@ +# 一、RAGFlow 部署前提 + +最低硬件要求: + +- CPU ≥ 4 核 +- 内存 ≥ 16 GB +- 磁盘 ≥ 50 GB +- Docker ≥ 24 +- Docker Compose ≥ 2.26 ([ragflow.com.cn][1]) + +RAGFlow 默认依赖这些组件: + +- MySQL +- Redis +- MinIO(对象存储) +- Elasticsearch / Infinity(检索) +- API Server + +这些都已经写在 `docker-compose` 里。 ([ragflow.com.cn][2]) + +--- + +# 二、系统参数调整(必须) + +RAGFlow 用 Elasticsearch,需要调内核参数: + +```bash +sysctl vm.max_map_count +``` + +如果小于 **262144**: + +```bash +sudo sysctl -w vm.max_map_count=262144 +``` + +永久生效: + +```bash +echo "vm.max_map_count=262144" >> /etc/sysctl.conf +sysctl -p +``` + +否则 ES 会启动失败。 ([ragflow.com.cn][1]) + +--- + +# 三、下载 RAGFlow + +```bash +git clone https://github.com/infiniflow/ragflow.git +cd ragflow +``` + +进入 docker 目录: + +```bash +cd docker +``` + +目录结构大概: + +``` +ragflow/ + ├ docker/ + │ ├ docker-compose.yml + │ ├ docker-compose-base.yml + │ ├ .env + │ └ service_conf.yaml.template +``` + +--- + +# 四、配置环境变量 + +编辑 `.env` + +```bash +nano .env +``` + +主要配置: + +```env +# elasticsearch +STACK_VERSION=8.11.3 +ELASTIC_PASSWORD=ragflow + +# kibana +KIBANA_USER=rag_flow +KIBANA_PASSWORD=infini_rag_flow + +# ports +ES_PORT=1200 +KIBANA_PORT=6601 +``` + +如果需要修改 Web 端口: + +编辑 `docker-compose.yml` + +```yaml +ports: + - "8080:80" +``` + +访问地址就变成: + +``` +http://服务器IP:8080 +``` + +--- + +# 五、启动 RAGFlow + +```bash +docker compose -f docker-compose.yml up -d +``` + +查看容器: + +```bash +docker ps +``` + +正常会有这些容器: + +``` +ragflow-server +ragflow-worker +mysql +redis +minio +elasticsearch +kibana +``` + +--- + +# 六、访问 RAGFlow + +浏览器访问: + +``` +http://服务器IP +``` + +首次使用需要注册账号。 + +然后就可以: + +1️⃣ 创建 Dataset(知识库) + +2️⃣ 上传 PDF / Markdown / 文档 + +3️⃣ 自动解析 + +4️⃣ 创建 AI Chat + +RAG 就跑起来了。 + +--- + +# 七、连接大模型 + +RAGFlow **本身不带 LLM**,需要接模型。 + +常见配置: + +| 类型 | 推荐 | +| ----- | -------------- | +| 本地模型 | Ollama | +| GPU推理 | vLLM | +| API | OpenAI / Azure | +| 国产 | DeepSeek | + +例如接 **Ollama** + +先装 Ollama: + +```bash +curl -fsSL https://ollama.com/install.sh | sh +``` + +拉模型: + +```bash +ollama pull llama3 +``` + +然后在 RAGFlow UI: + +``` +Settings → Model Providers +``` + +添加: + +``` +Provider: Ollama +URL: http://host.docker.internal:11434 +``` + +--- + +# 八、常用运维命令 + +查看日志 + +```bash +docker logs ragflow-server -f +``` + +停止 + +```bash +docker compose down +``` + +升级 + +```bash +git pull +docker compose pull +docker compose up -d +``` + +--- + +# 九、生产环境建议 + +推荐配置: + +``` +8 CPU +32GB RAM +100GB SSD +``` + +并且: + +- Elasticsearch 单独部署 +- MinIO 使用对象存储 +- GPU + vLLM + +RAGFlow 在企业环境一般是: + +``` +Nginx + │ +RAGFlow API + │ +Elasticsearch +Redis +MySQL +MinIO +``` + +--- + +# 十、很多人部署失败的 3 个原因 + +90% 卡在这里: + +### 1 Docker 版本太低 + +必须: + +``` +Docker ≥ 24 +Compose ≥ 2.26 +``` + +--- + +### 2 内存不足 + +RAGFlow 启动 ES + Python worker + +最低: + +``` +16GB +``` + +--- + +### 3 vm.max_map_count 没改 + +ES 直接 crash。 + +--- + +# 十一、如果你是做 AI 产品(强烈建议) + +我建议你这样部署 RAGFlow: + +``` +RAGFlow + │ +vLLM (推理) + │ +Embedding Service + │ +对象存储 +``` + +效果比默认好很多。 + +--- + +💡 如果你愿意,我可以再给你一份 **“RAGFlow 企业级部署架构”**(包括): + +- GPU 推理架构 +- embedding 服务 +- chunk pipeline +- RAGFlow + MCP +- 和你现在的 **智能体架构怎么融合** + +我可以直接画一张 **完整 RAG 系统架构图**。 + +[1]: https://ragflow.com.cn/docs?utm_source=chatgpt.com "快速入门 | RAGFlow 引擎" +[2]: https://ragflow.com.cn/docs/dev/configurations?utm_source=chatgpt.com "配置 | RAGFlow 引擎" diff --git a/work/移动杭研/AI 项目/RAG Flow.md b/work/移动杭研/AI 项目/RAG Flow.md new file mode 100644 index 0000000..8b817a1 --- /dev/null +++ b/work/移动杭研/AI 项目/RAG Flow.md @@ -0,0 +1,29 @@ +RAGFlow的核心映像在早期版本(如v0.21.1)约为9GB,这主要是因为包含了内置的embedding模型。 + +## 镜像大小变化 + +从v0.22.0开始,RAGFlow 改为只发布 slim 版本,不再包含内置的 embedding 模型,镜像大小减少到约 2 GB。 + +当前版本(v0.24.0)的镜像信息: + +- 下载大小:约2GB +- 运行时展开大小:约7GB + +## 9GB大小的原因 + +早期9GB的镜像包含: + +- 内置的BCE embedding模型 +- 内置的BGE embedding模型 +- 完整的RAGFlow应用程序及其所有依赖 + +现在 slim 版本需要用户自行配置外部的大模型和 embedding 服务,因此镜像体积大幅减小。 + +--- + +| 服务 | 用途 | Docker镜像 | +| ----------------- | --------- | -------------------------- | +| **Elasticsearch** | 向量数据库(默认) | `elasticsearch:8.11.3` | +| **Redis** | 缓存和消息队列 | `valkey:6.0.2` | +| **MySQL** | 元数据存储 | `mysql:8.0.39` | +| **MinIO** | 对象存储 | `minio:RELEASE.2025-06-13` | diff --git a/work/移动杭研/AI 项目/settings.local.json.md b/work/移动杭研/AI 项目/settings.local.json.md new file mode 100644 index 0000000..022429d --- /dev/null +++ b/work/移动杭研/AI 项目/settings.local.json.md @@ -0,0 +1,30 @@ +``` +{ + "permissions": { + "allow": [ + "Bash(./mvnw test:*)", + "Bash(./mvnw dependency:get:*)", + "Bash(curl:*)", + "mcp__deepwiki__ask_question", + "Bash(mvn test:*)", + "mcp__deepwiki__read_wiki_structure", + "mcp__deepwiki__read_wiki_contents", + "Bash(python:*)", + "Bash(mvn compile:*)", + "Bash(mvn dependency:tree:*)", + "Read(//c/Users/docke/.m2/repository/io/modelcontextprotocol/**)", + "Read(//c/Users/docke/.m2/**)", + "Bash(jar tf:*)", + "Bash(javap:*)", + "Bash(mvn clean:*)", + "Bash(mvn spring-boot:run:*)", + "Bash(jar:*)", + "WebFetch(domain:spec.modelcontextprotocol.io)", + "WebFetch(domain:spring.io)", + "WebFetch(domain:developers.redhat.com)", + "Bash(find \"D:\\\\MyCode\\\\Work\\\\yd-hy\\\\ibs-mcp\" -type f \\\\\\( -name \"*.sql\" -o -name \"schema*\" -o -name \"*schema*\" \\\\\\) 2>/dev/null | head -20)" + ] + } +} + +``` diff --git a/work/移动杭研/AI 项目/开发备注.md b/work/移动杭研/AI 项目/开发备注.md new file mode 100644 index 0000000..95452e9 --- /dev/null +++ b/work/移动杭研/AI 项目/开发备注.md @@ -0,0 +1,14 @@ +``` +{ + "success": true, + "message": "API Key 创建成功", + "data": { + "id": 1, + "apiKey": "c2f2956653614bc4ab05711c03f0ff36", + "tenantCode": "tenant001", + "description": "测试 API Key", + "enabled": true, + "createdAt": "2026-03-11T10:03:41.9902653" + } +} +```