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

  • 开源方案:没有特别合适直接调用的项目,所以基于 FumadocsAI-Chatbot 构建了一个 MDX 知识库 文档问答页

    001
    • 特色

      • 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;
      }
      
    • 待改进:未搭建数据库,用户和模型沟通记录无法保存。