1Panel-dev / MaxKB

🚀 MaxKB 是一款基于大语言模型和 RAG 的开源知识库问答系统,广泛应用于智能客服、企业内部知识库、学术研究与教育等场景。
https://maxkb.cn/
GNU General Public License v3.0
11.5k stars 1.51k forks source link

[BUG] Web 知识库无法完整同步某些站点 #1563

Open saurlax opened 1 week ago

saurlax commented 1 week ago

联系方式

saurlax@qq.com

MaxKB 版本

v1.7.0 (build at 2024-10-31T12:49, commit: 44b3aed5)

问题描述

使用 Web 知识库同步某些网站时,只能同步到一两个页面,例如下面的链接:

但是下面的网站却可以正常同步:

怀疑有可能是因为链接跟踪的问题,tauri 的文档在页头中有超链接的 /start/concept/blog/release 开头的就都能同步,而 starlight 的没有这样的规律,就导致了只同步的两个文档。

重现步骤

同步 starlight 的参数配置:

image

结果只得到了首页和第一个页面:

image

同步 tauri 的参数配置:

image

结果可以得到所有/start/concept/blog/release 开头的文档:

image

期待的正确结果

能够同步设置中定义的根目录下的所有页面。

相关日志输出

No response

附加信息

此外建议可以增加从 sitemap 导入的功能,这样对于一些现有支持 sitemap 功能的框架导入效果更好。知识库名称也可以设置为选取页面的 title 而不是超链接的文本。

saurlax commented 1 week ago

原因是 fork_child 函数的递归传参不当,导致在深层页面内搜集到的其他兄弟页面会被误丢弃,例如:

    @staticmethod
    def fork_child(child_link: ChildLink, selector_list: List[str], level: int, exclude_link_url: Set[str],
                   fork_handler):
        if level < 0:
            return
        else:
            child_link.url = remove_fragment(child_link.url)
            child_url = child_link.url[:-1] if child_link.url.endswith('/') else child_link.url
        if not exclude_link_url.__contains__(child_url):
            exclude_link_url.add(child_url)
            response = Fork(child_link.url, selector_list).fork()
            fork_handler(child_link, response)
            for child_link in response.child_link_list:
                child_url = child_link.url[:-1] if child_link.url.endswith('/') else child_link.url   # 这个列表会抛弃所有不是以 `url` 开头的链接
                if not exclude_link_url.__contains__(child_url):
                    ForkManage.fork_child(child_link, selector_list, level - 1, exclude_link_url, fork_handler)  # 但是传参的时候是逐级深入的,会导致某些兄弟页面无法被爬取

修复建议

多添加一个 root_url 参数来保证正确传递 base_url 信息。

zyyfit commented 6 days ago

感谢反馈,我们先排查一下问题