案例目标
Airtrain是一个支持非结构化/低结构化文本数据集的工具,它允许自动化聚类、文档分类等功能。本案例展示了如何使用LlamaIndex摄取和转换/丰富数据,然后将数据上传到Airtrain进行进一步处理和探索。
具体目标包括:
- 展示如何将LlamaIndex的Documents和Nodes上传到Airtrain平台
- 演示两种不同的数据处理方式:直接上传文档和先分割/嵌入再上传
- 展示如何将Airtrain集成到LlamaIndex的Workflow API中
- 演示如何从多个来源(GitHub、Web)获取数据并上传到Airtrain
技术栈与核心依赖
| 组件 | 库/工具 | 用途 |
|---|---|---|
| 核心框架 | llama-index | 提供文档和节点抽象及处理功能 |
| Airtrain集成 | airtrain-py[llama-index] | 提供与LlamaIndex的集成功能 |
| 嵌入模型 | llama-index-embeddings-openai | 提供OpenAI嵌入模型支持 |
| 数据读取器 | llama-index-readers-web | 从网页读取数据 |
| 数据读取器 | llama-index-readers-github | 从GitHub仓库读取数据 |
| 异步支持 | nest_asyncio | 在Jupyter notebook中支持异步操作 |
环境配置
1. 安装依赖
%pip install llama-index-embeddings-openai==0.2.4 %pip install llama-index-readers-web==0.2.2 %pip install llama-index-readers-github==0.2.0 # Install Airtrain SDK with LlamaIndex integration %pip install airtrain-py[llama-index]2. 设置异步环境
import nest_asyncio nest_asyncio.apply()3. API密钥配置
import os os.environ["GITHUB_TOKEN"] = "<your GitHub token>" os.environ["OPENAI_API_KEY"] = "<your OpenAi API key>" os.environ["AIRTRAIN_API_KEY"] = "<your Airtrain API key>"注意
获取Airtrain API密钥的步骤:
- 访问Airtrain注册页面创建账户
- 在左下角查看"Settings",然后转到"Billing"注册专业账户或开始试用
- 从"Billing"中的"Airtrain API Key"选项卡复制您的API密钥
请注意,Airtrain试用版一次只允许一个数据集。由于本notebook创建多个数据集,您可能需要在Airtrain UI中删除数据集,以便为另一个数据集腾出空间。
案例实现
示例1:使用读取器/嵌入/分割器
LlamaIndex中的一些核心抽象是文档和节点。Airtrain的LlamaIndex集成允许您通过upload_from_llama_nodes函数使用这些抽象的任何可迭代集合创建Airtrain数据集。
1.1 从GitHub读取文档
import os import airtrain as at from llama_index.core.node_parser import SemanticSplitterNodeParser from llama_index.embeddings.openai import OpenAIEmbedding from llama_index.readers.github import GithubRepositoryReader, GithubClient # 设置GitHub客户端 github_token = os.environ.get("GITHUB_TOKEN") github_client = GithubClient(github_token=github_token, verbose=True) reader = GithubRepositoryReader( github_client=github_client, owner="sematic-ai", repo="sematic", use_parser=False, verbose=False, filter_directories=( ["docs"], GithubRepositoryReader.FilterType.INCLUDE, ), filter_file_extensions=( [ ".md", ], GithubRepositoryReader.FilterType.INCLUDE, ), ) # 读取文档 read_kwargs = dict(branch="main") documents = reader.load_data(**read_kwargs)1.2 直接从文档创建数据集
您可以直接从这些文档创建Airtrain数据集,而无需进行任何进一步处理。在这种情况下,Airtrain会在生成进一步见解之前自动为您嵌入文档。数据集中的每一行将代表整个markdown文档。Airtrain将自动提供诸如文档语义聚类等见解,允许您通过查看覆盖相似主题的文档来浏览文档,或者发现您可能想要删除的文档子集。
result = at.upload_from_llama_nodes( documents, name="Sematic Docs Dataset: Whole Documents", ) print(f"Uploaded {result.size} rows to '{result.name}'. View at: {result.url}")1.3 分割和嵌入后创建数据集
如果您希望查看面向文档内节点而非整个文档的数据集,您也可以这样做。Airtrain将自动创建诸如嵌入向量的2D PCA投影等见解,以便您可以可视化探索将从中检索RAG节点的嵌入空间。您还可以单击单个行并查看在完整n维嵌入空间中与它最接近的行,以进一步深入。还将生成自动化聚类和其他见解,以丰富和帮助您的探索。
# 设置嵌入模型和分割器 embed_model = OpenAIEmbedding() splitter = SemanticSplitterNodeParser( buffer_size=1, breakpoint_percentile_threshold=95, embed_model=embed_model ) # 分割文档 nodes = splitter.get_nodes_from_documents(documents) # 上传到Airtrain result = at.upload_from_llama_nodes( nodes, name="Sematic Docs, split + embedded", ) print(f"Uploaded {result.size} rows to {result.name}. View at: {result.url}")注意
如果您正在使用Airtrain试用版并且已经创建了整个文档数据集,您需要在上传新数据集之前删除它。
示例2:使用Workflow API
由于文档和节点是Airtrain集成使用的核心抽象,而这些抽象在LlamaIndex的工作流API中共享,您也可以将Airtrain作为更广泛工作流的一部分使用。这里我们将通过抓取一些Hacker News评论线程来说明用法,但同样,您不仅限于网页抓取工作流;任何产生文档或节点的工作流都可以。
2.1 定义工作流事件
import asyncio from llama_index.core.schema import Node from llama_index.core.workflow import ( Context, Event, StartEvent, StopEvent, Workflow, step, ) from llama_index.readers.web import AsyncWebPageReader from airtrain import DatasetMetadata, upload_from_llama_nodes # 定义事件 class CompletedDocumentRetrievalEvent(Event): name: str documents: list[Node]2.2 定义工作流
class IngestToAirtrainWorkflow(Workflow): @step async def ingest_documents( self, ctx: Context, ev: StartEvent ) -> CompletedDocumentRetrievalEvent | None: if not ev.get("urls"): return None reader = AsyncWebPageReader(html_to_text=True) documents = await reader.aload_data(urls=ev.get("urls")) return CompletedDocumentRetrievalEvent( name=ev.get("name"), documents=documents ) @step async def ingest_documents_to_airtrain( self, ctx: Context, ev: CompletedDocumentRetrievalEvent ) -> StopEvent | None: dataset_meta = upload_from_llama_nodes(ev.documents, name=ev.name) return StopEvent(result=dataset_meta)2.3 执行工作流
# 指定要抓取的评论线程 URLS = [ "https://news.ycombinator.com/item?id=41694044", "https://news.ycombinator.com/item?id=41696046", # ... 更多URL ] # 定义异步主函数 async def main() -> None: workflow = IngestToAirtrainWorkflow() result = await workflow.run( name="My HN Discussions Dataset", urls=URLS, ) print( f"Uploaded {result.size} rows to {result.name}. View at: {result.url}" ) # 执行工作流 asyncio.run(main())案例效果
1. 文档上传结果
直接从文档创建数据集时,系统成功上传了42行数据到Airtrain:
Uploaded 42 rows to 'Sematic Docs Dataset: Whole Documents'. View at: https://app.airtrain.ai/dataset/7fd09dca-81b9-42b8-acc9-01ce08302b162. 分割和嵌入后上传结果
使用OpenAI嵌入和SemanticSplitterNodeParser分割文档后,系统成功上传了137行数据到Airtrain:
Uploaded 137 rows to Sematic Docs, split + embedded. View at: https://app.airtrain.ai/dataset/ebec9bcc-6ed8-4165-a0de-29bef740c70b3. 工作流上传结果
使用Workflow API从Hacker News抓取数据并上传到Airtrain时,系统成功上传了20行数据:
Uploaded 20 rows to My HN Discussions Dataset. View at: https://app.airtrain.ai/dataset/bd330f0a-6ff1-4e51-9fe2-9900a1a42308案例实现思路
1. 数据获取与处理
案例展示了两种数据获取方式:从GitHub仓库获取文档和从网页抓取内容。获取数据后,可以选择直接上传或进行进一步处理(如分割和嵌入)。
2. 文档与节点抽象
LlamaIndex的核心抽象是文档和节点。文档是原始数据的容器,而节点是文档的分割部分,通常包含更小、更集中的文本片段。Airtrain与LlamaIndex的集成基于这些抽象,允许用户上传任何文档或节点集合。
3. 数据上传与处理
使用upload_from_llama_nodes函数将数据上传到Airtrain。Airtrain会自动处理上传的数据,包括嵌入、聚类和生成见解。用户可以在Airtrain平台上探索和分析数据。
4. 工作流集成
通过将Airtrain集成到LlamaIndex的Workflow API中,可以将数据上传作为更大工作流的一部分。这允许用户创建复杂的数据处理管道,包括数据获取、处理和上传。
扩展建议
- 多源数据集成: 扩展系统以支持从更多数据源(如数据库、API、文件系统)获取数据
- 高级文档处理: 实现更高级的文档处理技术,如实体识别、关系提取和主题建模
- 自定义嵌入模型: 集成自定义或领域特定的嵌入模型,提高特定领域的检索准确性
- 实时数据同步: 实现与Airtrain的实时数据同步机制,保持数据集的最新状态
- 数据质量评估: 开发数据质量评估工具,自动检测和标记低质量数据
- 批量处理优化: 优化批量数据处理流程,提高大规模数据集的处理效率
- 可视化增强: 增强Airtrain平台的数据可视化功能,提供更丰富的数据探索体验
- 自动化工作流: 开发更多自动化工作流模板,简化常见数据处理任务的设置
总结
AirtrainAI Cookbook案例展示了如何将LlamaIndex与Airtrain平台集成,实现高效的数据处理和分析。通过两个详细的示例,案例演示了从不同数据源获取数据、处理数据并上传到Airtrain进行进一步分析的方法。
第一个示例展示了如何从GitHub获取文档,并以两种方式上传到Airtrain:直接上传整个文档和先分割/嵌入再上传。这种方法为用户提供了灵活性,可以根据具体需求选择最适合的数据处理方式。
第二个示例展示了如何将Airtrain集成到LlamaIndex的Workflow API中,创建更复杂的数据处理管道。这种方法特别适合需要从多个来源获取数据并进行复杂处理的场景。
总的来说,该案例为研究人员和开发人员提供了一个强大的工具,用于处理和分析非结构化文本数据。通过结合LlamaIndex的灵活处理能力和Airtrain的高级分析功能,用户可以更有效地从大量文本数据中提取有价值的见解。