- Published on
开源 | MDX 作为 ChatBot 知识库
问题
- 在搭建知识库过程中的一些思考。
- 处理企业常用的 DOCX、PDF、EXCEL 等文件数据搭建向量数据库流程是个重复性劳动,需要清洗、切片、向量化,成本并不低于生产过程。
- 向量模型选择的难点:
- 在模型快速迭代期,无法选定一个模型版本。
- 部分开源模型不提供在线服务,需要自己部署,成本高。
- 提供在线服务的模型必须上传数据。
文件格式对比
对于大多数中小企业来说,也许并不需要搭建复杂的向量数据库和 WorkFlow,只要将自己的数据源规范化即可。常用的 DOCX 和 PDF 并不适合作为数据库原文件直接给模型解读,结合几个考虑点,MDX 最合适。
- 理念:减少信息传递过程当中人工干预的环节。文件生产出来后可以给用户浏览,也可以给模型解读。
- 文件结构清晰,适合人工编辑。
- 文件可以渲染为网页(又是一个步骤的节省)。
常见类型对比
MDX (Markdown Extended, 扩展的 Markdown):融合了 Markdown 和 JSX 语法,支持更丰富的功能(如变量、组件等)。
--- title: 'MDX 作为 ChatBot 知识库' author: 'Chuck' date: '2025-07-29' tags: ['开源', 'chatbot', '知识库'] --- import { PrintButton } from '@/components/print-button'; <PrintButton /> MDX 示例。 ## 方案对比 - MDX - JSON - YAML
JSON (JavaScript Object Notation, 对象表示法):内容由属性和值所组成,结构清晰。更适合高度结构化数据(如产品参数)。
{ "title": "MDX 作为 ChatBot 知识库", "author": "Chuck", "date": "2025-07-29", "tags": ["开源", "chatbot", "知识库"], "content": "JSON 示例。 \n\n## 方案对比\n- MDX \n- JSON \n- YAML" }
YAML:用来表达数据序列化的格式。更适合作为配置文件。
title: "MDX 作为 ChatBot 知识库" author: "Chuck" date: "2025-07-29" tags: - "开源" - "chatbot" - "知识库" content: | YAML 示例。 ## 方案对比 - MDX - JSON - YAML
MDX 知识库
浏览了将 MDX 作为知识库的相关项目
- Fumadocs 基于 Next.js 开发的文档框架。
AI 搜索对话框需要配置 Inkeep AI,Inkeep AI 基于 Vercel AI SDK 开发。
- Mintlify 基于 Fumadocs 商业化。
AI Assistant 需要开通会员。Pro $150/month,PDF export 一个简单功能需要升级 Growth $550/month
- Fumadocs 基于 Next.js 开发的文档框架。
开源方案:没有特别合适直接调用的项目,所以基于 Fumadocs 和 AI-Chatbot 构建了一个 MDX 知识库 文档问答页。
- [Github]aibangxuanxing-docs
MDX serves as the knowledge base of the model.
特色
- AI SDK 支持的模型丰富。
- MDX 文件直接作为数据库,拆分用户问题后用 Orama Search Engine 检索 MDX 文档,模型基于检索到的内容片段回答问题。
核心文件
- app/api/chat/route.ts
# 模型提示词 const systemPromptTemplate = ` ## 你的角色 你是一个专业的文档助手,专门帮助用户理解和使用产品文档。 ## 工作原则: 1. 优先基于文档内容回答问题,如果文档中没有相关信息,请明确说明并提供一般性建议 2. 支持中英文交流 3. 需给出完整的文档链接,文档链接组成: https://docs.aibangxuanxing.com/docs/{page.path} 4. 输出格式:回答请以 Markdown 格式输出,要求结构清晰、易读。 ## 相关文档内容: {context} `;
- app/api/search/route.ts
# 搜索路由,支持中英文 # https://docs.orama.com/open-source/supported-languages const mixedTokenizer = createTokenizer({ language: 'mandarin', // Merge Chinese and English stop words stopWords: [...mandarinStopwords, ...englishStopwords], });
- components/product-comparison-table.tsx
# 渲染 MDX 中复杂的产品参数表,减少 MDX 中有效内容外的的代码 interface ProductData { models?: Record<string, string[]> | string[]; sections?: Record<string, Record<string, any>> | any[]; notes?: string[]; } interface ProductComparisonTableProps { data: ProductData; }
待改进:未搭建数据库,用户和模型沟通记录无法保存。
- [Github]aibangxuanxing-docs