构建更智能的文档聊天机器人使用 Firecrawl 和 KDB.AI 的实用指南

构建更智能的文档聊天机器人使用 Firecrawl 和 KDB.AI 的实用指南

Barry Lv6

老实说,我讨厌阅读文档。当大型语言模型可以为我阅读文档时,我为什么还要自己去看呢?本指南探讨了如何构建一个文档聊天机器人,正是利用 Firecrawl 进行网页抓取,使用 KDB.AI 进行向量存储和检索。

文档挑战

在我们深入技术细节之前,让我们讨论一下为什么我们要构建这个聊天机器人。许多组织面临着类似的文档问题:

  1. 信息过载:大量的文档可能会让用户感到不知所措。
  2. 相关性:传统搜索往往返回太多不相关的结果。
  3. 上下文:用户很难找到与其特定情况相关的信息。
  4. 时效性:过时的信息会误导用户。

一个实施良好的聊天机器人可以通过提供针对性的、最新的响应来解决这些问题。让我们探讨一下 Firecrawl (sign up link ) 和 KDB.AI (sign up link ) 是如何实现这一目标的。

Firecrawl: 简化网页抓取

网页抓取通常是一项复杂的任务。为检索增强生成提取内容可能更具挑战性。Firecrawl 是一个为您抓取或抓取的工具,以 markdown 格式提取相关内容。这将整个过程简化为仅需几行代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from firecrawl import FirecrawlApp

app = FirecrawlApp(api_key='your-firecrawl-api-key')

crawl_result = app.crawl_url(
'https://code.kx.com/kdbai',
params={
'crawlerOptions': {
'limit': 10,
'includes': ['kdbai/*']
},
'pageOptions': {
'onlyMainContent': True
}
},
wait_until_done=True
)

此代码片段演示了 Firecrawl 的几个关键特性:

  • limit: 控制抓取的范围。适用于测试或较小的文档集。
  • includes: 将爬虫集中在相关部分。
  • onlyMainContent: 提取主要内容,减少噪音。

Firecrawl 处理 JavaScript 渲染和复杂的网站结构,这通常对传统抓取工具构成挑战。这种高效性使您的知识库能够更频繁地更新,确保您的聊天机器人始终拥有最新的信息。

Firecrawl:深入了解其功能

虽然我们已经介绍了一些基础知识,但 Firecrawl 提供了多种高级功能,使其在网络爬虫领域中独树一帜:

高级爬虫选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
crawl_result = app.crawl_url(
'https://example.com',
params={
'crawlerOptions': {
'limit': 100,
'includes': ['/blog/*', '/docs/*'],
'excludes': ['/admin/*', '/login/*'],
'maxDepth': 3,
'mode': "fast"
},
'pageOptions': {
'onlyMainContent': True,
'includeHtml': True,
'screenshot': True,
'waitFor': 5000
}
}
)让我们来分解这些选项:

选择性爬取

  • includesexcludes 允许您针对网站的特定部分,确保只收集相关数据。
  • maxDepth 控制爬虫的深度,在全面覆盖和效率之间取得平衡。

性能模式

  • fast 模式可以在没有网站地图的情况下以 4 倍的速度爬取网站,尽管对于重度 JavaScript 渲染的网站可能准确性较低。

内容提取

  • onlyMainContent 自动去除头部、底部和侧边栏等杂乱内容。
  • includeHtml 选项允许您在需要时保留 HTML 结构。

视觉捕捉

  • screenshot 功能对于视觉文档或调试至关重要。

JavaScript 处理

  • waitFor 确保在抓取之前 JavaScript 渲染的内容已正确加载,解决了网络爬取中的一个常见痛点。

结构化数据提取

Firecrawl 超越了简单的文本提取,通过使用 LLM 驱动的提取来提取结构化数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
result = app.scrape_url(
"https://example.com",
params={
"extractorOptions": {
"mode": "llm-extraction",
"extractionPrompt": "Extract key product information.",
"extractionSchema": {
"type": "object",
"properties": {
"product_name": {"type": "string"},
"price": {"type": "number"},
"in_stock": {"type": "boolean"}
}
}
}
}
)

此功能使您能够:

  • 从网页中提取特定的、结构化的信息。
  • 使用自然语言提示自定义提取以满足您的需求。
  • 确保提取数据格式的一致性。

处理动态内容

许多现代网站在内容渲染上严重依赖 JavaScript,这使得传统的爬虫难以应对。Firecrawl 有效地解决了这个问题:

  • 它可以在抓取之前等待特定元素加载。
  • waitFor 选项允许您指定延迟,确保所有动态内容都已加载。
  • Firecrawl 可以与页面交互(例如,点击按钮、滚动)以在抓取之前显示内容。
  • Firecrawl 还与 Browserbase(用于 AI 代理的无头浏览器)集成,因此它可以抓取需要登录的页面!

KDB.AI: 强大的向量存储和检索

KDB.AI 提供了一种强大的内容存储和检索解决方案。 (声明:我在 KDB.AI 担任开发者倡导者。)要获取您的 KDB.AI API 密钥,请在 kdb.ai 注册。注册是免费的,您的访问权限不会过期。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import kdbai_client as kdbai

session = kdbai.Session(endpoint="your-kdbai-endpoint", api_key="your-kdbai-api-key")

schema = {
"columns": [
{"name": "document_id", "pytype": "bytes"},
{"name": "text", "pytype": "bytes"},
{
"name": "embedding",
"vectorIndex": {
"type": "flat",
"metric": "L2",
"dims": 1536
}
},
{"name": "title", "pytype": "bytes"},
{"name": "sourceURL", "pytype": "bytes"},
{"name": "lastmod", "pytype": "datetime64[ns]"}
]
}

table = session.create_table("documentation", schema)

我们的模式设计包含两个关键组件,以优化搜索和检索:

  1. 嵌入列:
  • 包含内容的向量表示
  • 利用平面索引进行高效、全面的向量搜索
  • 支持基于相似性的查询,以查找概念上相关的信息。
  1. 元数据字段:
  • title: 内容的描述性名称
  • sourceURL: 信息的来源
  • lastmod: 最后修改时间戳

这些字段有助于精确过滤,并为响应提供重要的上下文。

这种双重结构使得强大且具有上下文感知的搜索成为可能,结合了语义相似性和特定的元数据约束。

元数据过滤器的强大功能

元数据过滤器是 KDB.AI 的亮点所在。它们使聊天机器人能够理解用户查询的上下文,并提供更相关的答案。以下是具体方法:

1
2
3
4
5
6
7
8
9
10
11
12
# Query with URL filtering
filtered_query_engine = index.as_query_engine(
filters=[("in", "sourceURL", "https://code.kx.com/kdbai/latest/gettingStarted/kdb-ai-server-setup.html")]
)
print(filtered_query_engine.query("What are the hardware requirements for KDB.AI Server?"))

# Query with date filtering
three_months_ago = datetime.datetime.now() - datetime.timedelta(days=90)
recent_docs_engine = index.as_query_engine(
filters=[("lastmod", ">", three_months_ago)]
)
print(recent_docs_engine.query("What are the latest features added to KDB.AI?"))
  1. 结合各种元数据字段以创建高度特定的查询。

整合所有内容

通过将 Firecrawl 高效的网页抓取与 KDB.AI 的高级查询能力相结合,我们开发了一个可以:

  1. 保持您的文档知识库的最新状态。
  2. 理解用户查询的上下文。
  3. 提供相关且及时的响应。

以下是一个使用 Llamaindex 集成所有内容的基本实现,这是一个用于构建 LLM 应用程序的库:

我们可以用几行代码来实现这一点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# !pip install firecrawl-py llama_index kdbai_client llama-index-vector-stores-kdbai
from firecrawl import FirecrawlApp
import kdbai_client as kdbai
from llama_index.core import VectorStoreIndex, Document, StorageContext
from llama_index.vector_stores.kdbai import KDBAIVectorStore
from llama_index.embeddings.openai import OpenAIEmbedding

# Firecrawl 设置和抓取
app = FirecrawlApp(api_key='your-firecrawl-api-key')
crawl_result = app.crawl_url(
'https://code.kx.com/kdbai',
params={
'crawlerOptions': {
'limit': 10,
'includes': ['kdbai/*']
},
'pageOptions': {
'onlyMainContent': True
}
},
wait_until_done=True
)

# KDB.AI 设置
session = kdbai.Session(endpoint="your-kdbai-endpoint", api_key="your-kdbai-api-key")
# 我们的模式包括额外的元数据字段,以便我们可以按它们进行过滤
schema = {
"columns": [
{"name": "document_id", "pytype": "bytes"},
{"name": "text", "pytype": "bytes"},
{
"name": "embedding",
"vectorIndex": {
"type": "flat",
"metric": "L2",
"dims": 1536
}
},
{"name": "title", "pytype": "bytes"},
{"name": "sourceURL", "pytype": "bytes"},
{"name": "lastmod", "pytype": "datetime64[ns]"}
]
}
table = session.create_table("documentation", schema)

# 处理和索引文档
documents = [Document(text=item['content'], metadata=item['metadata']) for item in crawl_result]
vector_store = KDBAIVectorStore(table)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(
documents,
storage_context=storage_context,
embed_model=OpenAIEmbedding()
)

# 创建查询引擎
query_engine = index.as_query_engine()

# 示例查询
response = query_engine.query("KDB.AI 的系统要求是什么?")
print(response)

展望未来

虽然这个实现提供了一个坚实的基础,但总有改进的空间:

  1. 用户界面:开发一个用户友好的前端,以便于交互。
  2. 持续爬取:在我们的文档发生变化时重新爬取并索引我们的数据。
  3. 性能优化:通过引入混合搜索来增强技术文档的检索性能,混合搜索结合了关键词搜索和语义搜索。有关混合搜索的示例,请查看 KDB.AI 的实现 这里

最后的思考

Firecrawl 的先进网页抓取能力确保您的聊天机器人始终能够访问最新和最相关的信息。它处理动态内容、提取结构化数据和高效扩展的能力,使其成为保持知识库最新的强大工具。

KDB.AI 的向量存储和高级查询能力,特别是其元数据过滤功能,使您的聊天机器人能够提供上下文感知的相关响应。这种语义搜索和精确过滤的结合确保用户能够在需要时找到他们所需的确切信息。

通过将这些工具结合使用,您可以创建一个强大的系统,更有效地浏览和理解您的文档,可能消除再次阅读文档的需要!

LinkedIn 上与我联系,获取更多 AI 工程技巧。

  • 标题: 构建更智能的文档聊天机器人使用 Firecrawl 和 KDB.AI 的实用指南
  • 作者: Barry
  • 创建于 : 2024-07-26 02:40:11
  • 更新于 : 2024-08-31 06:59:45
  • 链接: https://wx.role.fun/2024/07/26/67cfae2e09e746cabf09015054797be0/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。