案例目标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-openai0.2.4 %pip install llama-index-readers-web0.2.2 %pip install llama-index-readers-github0.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_tokengithub_token, verboseTrue) reader GithubRepositoryReader( github_clientgithub_client, ownersematic-ai, reposematic, use_parserFalse, verboseFalse, filter_directories( [docs], GithubRepositoryReader.FilterType.INCLUDE, ), filter_file_extensions( [ .md, ], GithubRepositoryReader.FilterType.INCLUDE, ), ) # 读取文档 read_kwargs dict(branchmain) documents reader.load_data(**read_kwargs)1.2 直接从文档创建数据集您可以直接从这些文档创建Airtrain数据集而无需进行任何进一步处理。在这种情况下Airtrain会在生成进一步见解之前自动为您嵌入文档。数据集中的每一行将代表整个markdown文档。Airtrain将自动提供诸如文档语义聚类等见解允许您通过查看覆盖相似主题的文档来浏览文档或者发现您可能想要删除的文档子集。result at.upload_from_llama_nodes( documents, nameSematic Docs Dataset: Whole Documents, ) print(fUploaded {result.size} rows to {result.name}. View at: {result.url})1.3 分割和嵌入后创建数据集如果您希望查看面向文档内节点而非整个文档的数据集您也可以这样做。Airtrain将自动创建诸如嵌入向量的2D PCA投影等见解以便您可以可视化探索将从中检索RAG节点的嵌入空间。您还可以单击单个行并查看在完整n维嵌入空间中与它最接近的行以进一步深入。还将生成自动化聚类和其他见解以丰富和帮助您的探索。# 设置嵌入模型和分割器 embed_model OpenAIEmbedding() splitter SemanticSplitterNodeParser( buffer_size1, breakpoint_percentile_threshold95, embed_modelembed_model ) # 分割文档 nodes splitter.get_nodes_from_documents(documents) # 上传到Airtrain result at.upload_from_llama_nodes( nodes, nameSematic Docs, split embedded, ) print(fUploaded {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_textTrue) documents await reader.aload_data(urlsev.get(urls)) return CompletedDocumentRetrievalEvent( nameev.get(name), documentsdocuments ) step async def ingest_documents_to_airtrain( self, ctx: Context, ev: CompletedDocumentRetrievalEvent ) - StopEvent | None: dataset_meta upload_from_llama_nodes(ev.documents, nameev.name) return StopEvent(resultdataset_meta)2.3 执行工作流# 指定要抓取的评论线程 URLS [ https://news.ycombinator.com/item?id41694044, https://news.ycombinator.com/item?id41696046, # ... 更多URL ] # 定义异步主函数 async def main() - None: workflow IngestToAirtrainWorkflow() result await workflow.run( nameMy HN Discussions Dataset, urlsURLS, ) print( fUploaded {result.size} rows to {result.name}. View at: {result.url} ) # 执行工作流 asyncio.run(main())案例效果1. 文档上传结果直接从文档创建数据集时系统成功上传了42行数据到AirtrainUploaded 42 rows to Sematic Docs Dataset: Whole Documents. View at: https://app.airtrain.ai/dataset/7fd09dca-81b9-42b8-acc9-01ce08302b162. 分割和嵌入后上传结果使用OpenAI嵌入和SemanticSplitterNodeParser分割文档后系统成功上传了137行数据到AirtrainUploaded 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的高级分析功能用户可以更有效地从大量文本数据中提取有价值的见解。