提取 JSON(法学硕士)
在某些情况下,您需要从网页中提取复杂或非结构化的信息,而简单的 CSS/XPath 模式无法轻松解析这些信息。或者,您需要 AI 驱动的洞察、分类或摘要。针对这些场景,Crawl4AI 提供了一种基于 LLM 的提取策略,该策略可以:
- 可与LiteLLM (Ollama、OpenAI、Claude 等)支持的任何大型语言模型配合使用。
- 自动将内容分成块(如果需要)以处理令牌限制,然后合并结果。
- 允许您定义模式(如 Pydantic 模型)或更简单的“块”提取方法。
重要提示:基于 LLM 的提取可能比基于架构的方法更慢且成本更高。如果您的页面数据高度结构化,请考虑使用JsonCssExtractionStrategy
或者JsonXPathExtractionStrategy
首先。但如果你需要人工智能来解释或重新组织内容,请继续阅读!
1. 为什么要使用法学硕士学位?
- 复杂推理:如果网站的数据是非结构化的、分散的或充满自然语言上下文。
- 语义提取:需要理解的摘要、知识图或关系数据。
- 灵活:您可以将指令传递给模型以进行更高级的转换或分类。
2. 通过 LiteLLM 实现提供商无关
您可以使用 LlmConfig 快速配置多种 LLM 变体,并进行实验以找到最适合您用例的变体。您可以在此处阅读有关 LlmConfig 的更多信息。
Crawl4AI 使用“提供者字符串”(例如,"openai/gpt-4o"
,"ollama/llama2.0"
,"aws/titan"
) 来识别你的 LLM 课程。LiteLLM 支持的任何模式都可以。你只需提供:
- : 这
<provider>/<model_name>
标识符(例如,"openai/gpt-4"
,"ollama/llama2"
,"huggingface/google-flan"
, ETC。)。 - :如果需要(对于 OpenAI、HuggingFace 等);本地模型或 Ollama 可能不需要它。
- (可选):如果您的提供商有自定义端点。
这意味着你不会被单一的 LLM 课程所束缚。轻松切换或尝试。
3. LLM 提取的工作原理
3.1 流程
1. 分块(可选):如果 HTML 或 Markdown 很长,则会将其拆分成更小的段(基于chunk_token_threshold
、重叠等)。2. 提示构建:对于每个块,图书馆都会形成一个提示,其中包含你的instruction
(可能还有模式或示例)。3. LLM 推理:每个块并行或顺序发送到模型(取决于您的并发性)。4. 合并:每个块的结果合并并解析为 JSON。
3.2extraction_type
- :该模型尝试返回符合基于 Pydantic 模式的 JSON。
- :该模型返回库收集的自由格式文本或较小的 JSON 结构。
对于结构化数据,"schema"
建议。您提供schema=YourPydanticModel.model_json_schema()
。
4. 关键参数
以下是重要的 LLM 提取参数的概述。所有参数通常都设置在LLMExtractionStrategy(...)
。然后你把这个策略放在你的CrawlerRunConfig(..., extraction_strategy=...)
。
1.llmConfig
(LlmConfig):例如,"openai/gpt-4"
,"ollama/llama2"
.2.schema
(dict):描述所需字段的 JSON 模式。通常由YourModel.model_json_schema()
.3.extraction_type
(字符串):"schema"
或者"block"
.4.instruction
(str):提示文本,告诉 LLM 你想要提取的内容。例如,“将这些字段提取为 JSON 数组。” 5.chunk_token_threshold
(int):每个块的最大标记数。如果你的内容很大,可以将其拆分成多个部分,以便申请法学硕士 (LLM)。6.overlap_rate
(浮点数):相邻块之间的重叠率。例如,0.1
意味着每个块重复 10% 以保持上下文的连续性。7.apply_chunking
(布尔值):设置True
自动分块。如果您想要单次传递,请设置False
.8.input_format
(str):决定将哪个爬虫结果传递给 LLM。选项包括:-"markdown"
:原始 markdown(默认)。-"fit_markdown"
:如果您使用内容过滤器,则过滤后的“适合”标记。 -"html"
:已清理或原始的 HTML。9.extra_args
(dict): 其他 LLM 参数,例如temperature
,max_tokens
,top_p
等10.show_usage()
:您可以调用此方法来打印使用信息(每个块的令牌使用情况,如果已知则为总成本)。
例子:
extraction_strategy = LLMExtractionStrategy(
llm_config = LLMConfig(provider="openai/gpt-4", api_token="YOUR_OPENAI_KEY"),
schema=MyModel.model_json_schema(),
extraction_type="schema",
instruction="Extract a list of items from the text with 'name' and 'price' fields.",
chunk_token_threshold=1200,
overlap_rate=0.1,
apply_chunking=True,
input_format="html",
extra_args={"temperature": 0.1, "max_tokens": 1000},
verbose=True
)
5. 投入CrawlerRunConfig
重要提示:在 Crawl4AI 中,所有策略定义都应该放在CrawlerRunConfig
,而不是直接作为参数arun()
。这是一个完整的例子:
import os
import asyncio
import json
from pydantic import BaseModel, Field
from typing import List
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode, LLMConfig
from crawl4ai import LLMExtractionStrategy
class Product(BaseModel):
name: str
price: str
async def main():
# 1. Define the LLM extraction strategy
llm_strategy = LLMExtractionStrategy(
llm_config = LLMConfig(provider="openai/gpt-4o-mini", api_token=os.getenv('OPENAI_API_KEY')),
schema=Product.schema_json(), # Or use model_json_schema()
extraction_type="schema",
instruction="Extract all product objects with 'name' and 'price' from the content.",
chunk_token_threshold=1000,
overlap_rate=0.0,
apply_chunking=True,
input_format="markdown", # or "html", "fit_markdown"
extra_args={"temperature": 0.0, "max_tokens": 800}
)
# 2. Build the crawler config
crawl_config = CrawlerRunConfig(
extraction_strategy=llm_strategy,
cache_mode=CacheMode.BYPASS
)
# 3. Create a browser config if needed
browser_cfg = BrowserConfig(headless=True)
async with AsyncWebCrawler(config=browser_cfg) as crawler:
# 4. Let's say we want to crawl a single page
result = await crawler.arun(
url="https://example.com/products",
config=crawl_config
)
if result.success:
# 5. The extracted content is presumably JSON
data = json.loads(result.extracted_content)
print("Extracted items:", data)
# 6. Show usage stats
llm_strategy.show_usage() # prints token usage
else:
print("Error:", result.error_message)
if __name__ == "__main__":
asyncio.run(main())
6. 分块细节
6.1chunk_token_threshold
如果您的页面很大,您可能会超出 LLM 的上下文窗口。chunk_token_threshold
设置每个块的近似最大标记数。该库使用以下公式计算单词→标记比率:word_token_rate
(通常默认值为 ~0.75)。如果启用了分块(apply_chunking=True
),文本被分成几段。
6.2overlap_rate
为了保持语境在各个块之间的连续性,我们可以将它们重叠。例如,overlap_rate=0.1
表示每个后续区块包含前一个区块文本的 10%。如果您需要的信息可能跨越区块边界,这将非常有用。
6.3 性能与并行性
通过分块,您可以并行处理多个块(取决于您的并发设置和 LLM 提供商)。如果网站规模庞大或包含多个部分,这可以减少总时间。
7.输入格式
默认情况下,LLMExtractionStrategy 使用input_format="markdown"
,这意味着爬虫的最终 markdown 会被输入到 LLM。你可以将其更改为:
- :清理后的 HTML 或原始 HTML(取决于您的爬虫配置)进入 LLM。
- :例如,如果你使用
PruningContentFilter
,则使用“fit”版本的 Markdown。如果您信任过滤器,这可以大幅减少标记数。 - :爬虫的标准 markdown 输出
markdown_generator
。
这个设置至关重要:如果 LLM 指令依赖于 HTML 标签,请选择"html"
。如果您更喜欢基于文本的方法,请选择"markdown"
。
8. 代币使用和展示使用
为了跟踪令牌和成本,每个块都通过 LLM 调用进行处理。我们将使用情况记录在:
- (列表):每个块或调用的令牌使用情况。
- :所有块调用的总和。
- :打印使用情况报告(如果提供商返回使用情况数据)。
llm_strategy = LLMExtractionStrategy(...)
# ...
llm_strategy.show_usage()
# e.g. “Total usage: 1241 tokens across 2 chunk calls”
如果您的模型提供商不返回使用信息,这些字段可能是部分的或空的。
9.示例:构建知识图谱
下面是一个片段,结合了LLMExtractionStrategy
使用 Pydantic 架构来构建知识图谱。注意我们如何传递instruction
告诉模型要解析什么。
import os
import json
import asyncio
from typing import List
from pydantic import BaseModel, Field
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode, LLMConfig
from crawl4ai import LLMExtractionStrategy
class Entity(BaseModel):
name: str
description: str
class Relationship(BaseModel):
entity1: Entity
entity2: Entity
description: str
relation_type: str
class KnowledgeGraph(BaseModel):
entities: List[Entity]
relationships: List[Relationship]
async def main():
# LLM extraction strategy
llm_strat = LLMExtractionStrategy(
llmConfig = LLMConfig(provider="openai/gpt-4", api_token=os.getenv('OPENAI_API_KEY')),
schema=KnowledgeGraph.model_json_schema(),
extraction_type="schema",
instruction="Extract entities and relationships from the content. Return valid JSON.",
chunk_token_threshold=1400,
apply_chunking=True,
input_format="html",
extra_args={"temperature": 0.1, "max_tokens": 1500}
)
crawl_config = CrawlerRunConfig(
extraction_strategy=llm_strat,
cache_mode=CacheMode.BYPASS
)
async with AsyncWebCrawler(config=BrowserConfig(headless=True)) as crawler:
# Example page
url = "https://www.nbcnews.com/business"
result = await crawler.arun(url=url, config=crawl_config)
print("--- LLM RAW RESPONSE ---")
print(result.extracted_content)
print("--- END LLM RAW RESPONSE ---")
if result.success:
with open("kb_result.json", "w", encoding="utf-8") as f:
f.write(result.extracted_content)
llm_strat.show_usage()
else:
print("Crawl failed:", result.error_message)
if __name__ == "__main__":
asyncio.run(main())
主要观察:
- 确保我们得到符合我们要求的 JSON
KnowledgeGraph
。 - 意味着我们将 HTML 提供给模型。
- 指导模型输出结构化的知识图谱。
10. 最佳实践与注意事项
1. 成本与延迟:LLM 调用可能很慢或成本高昂。如果您只需要部分数据,请考虑分块或缩小覆盖范围。2. 模型标记限制:如果您的页面 + 指令超出了上下文窗口,则分块至关重要。3. 指令工程:精心设计的指令可以显著提高输出可靠性。4. 模式严格性:"schema"
提取会尝试将模型输出解析为 JSON。如果模型返回无效的 JSON,则可能会进行部分提取,或者您可能会收到错误。5. 并行 vs. 串行:该库可以并行处理多个块,但您必须注意某些提供程序的速率限制。6. 检查输出:有时,LLM 可能会遗漏字段或产生多余的文本。您可能需要使用 Pydantic 进行后验证或进行额外的清理。
11. 结论
Crawl4AI 中基于 LLM 的提取与提供商无关,您可以通过 LiteLLM 从数百个模型中进行选择。它非常适合语义复杂的任务或生成知识图谱等高级结构。然而,与基于模式的方法相比,它速度较慢且成本可能更高。请记住以下几点:
- 制定你的法学硕士 (LLM) 策略
CrawlerRunConfig
。 - 使用
input_format
选择 LLM 看到的形式(markdown、HTML、fit_markdown)。 - 调整
chunk_token_threshold
,overlap_rate
, 和apply_chunking
高效处理大量内容。 - 使用以下方式监控令牌使用情况
show_usage()
。
如果您的网站数据一致或重复,请考虑JsonCssExtractionStrategy
首先是为了速度和简单性。但如果你需要一种人工智能驱动的方法,LLMExtractionStrategy
提供灵活的多提供商解决方案,用于从任何网站提取结构化 JSON。
后续步骤:
1. 尝试不同的供应商 - 尝试切换provider
(例如,"ollama/llama2"
,"openai/gpt-4o"
等)来查看速度、准确性或成本的差异。 - 通过不同的extra_args
喜欢temperature
,top_p
, 和max_tokens
来微调您的结果。
2. 性能调整 - 如果页面很大,则调整chunk_token_threshold
,overlap_rate
, 或者apply_chunking
优化吞吐量。 - 使用以下方式检查使用日志show_usage()
密切关注代币消耗并识别潜在的瓶颈。
3. 验证输出 - 如果使用extraction_type="schema"
,使用 Pydantic 模型解析 LLM 的 JSON 以进行最后的验证步骤。 - 优雅地记录或处理任何解析错误,特别是当模型偶尔返回格式错误的 JSON 时。
4. 探索钩子和自动化 - 将 LLM 提取与钩子集成,以进行复杂的预/后处理。 - 使用多步骤管道:抓取、过滤、LLM 提取,然后存储或索引结果以供进一步分析。
最后更新时间:2025-01-01
以上就是 JSON 提取(LLM)的全部内容——现在你可以利用 AI 来解析、分类或重组 Web 数据了。祝你抓取愉快!