2024青训营×AI班第二课

152 阅读13分钟

AI第二课

引言

在AI开发的第二课中,我们的核心任务是明确AI的知识储备。就像人类需要知识储备才能回答问题一样,AI也需要丰富的知识库来提供有效的回答。为了实现这一目标,我们需要为AI构建一个全面的数据源。这些数据源可以包括多种类型:

  • 非结构化数据:如PDF、文档等自由格式的数据;
  • 结构化数据:如SQL数据库等有组织的、清晰结构的数据;
  • 代码资源:如Python、Java等编程语言的代码。

通过整合这些不同的数据源,AI能够更好地理解问题并提供准确、专业的回答。接下来,我们将详细探讨如何为AI提供非结构化的数据源,以增强其回答能力。

1. 非结构化数据的类型以及其读取方式

非结构化数据是指那些没有固定结构或模式的数据,如文本、图像、音频和视频等。在AI应用中,常见的非结构化数据类型及其读取方法如下:

  1. 文本文件(TXT、CSV)

    • 文本文件是最常见的非结构化数据之一,包含自然语言文本或标记数据,也是我们新手在本地读取时,最常用的一种文件
    • 读取方式:依旧是直接使用Python的内建open()函数,当然,我们也可以使用更高效的pandas库(特别适用于CSV文件)。
    # 读取TXT文件
    with open("file.txt", "r", encoding="utf-8") as file:
        content = file.read()
    
    # 读取CSV文件
    import pandas as pd
    csv_data = pd.read_csv("file.csv")
    
  2. PDF文件

    • PDF文件包含丰富的文字内容,并且常用于存储报告、研究论文等文档,也是我们最常接受到的一种文件形式
    • 读取方式:我们无法直接读取PDF,需要使用外部库PyPDF2pdfplumber库来提取文字内容。
    import PyPDF2
    
    # 读取PDF文件
    with open("file.pdf", "rb") as file:
        pdf_reader = PyPDF2.PdfReader(file)
        pdf_text = ""
        for page in pdf_reader.pages:
            pdf_text += page.extract_text()
    
  3. Word文档(DOCX)

    • Word文件也常用来存储非结构化文本数据,如报告、文档。
    • 读取方式:可以使用python-docx库。
    from docx import Document
    
    # 读取DOCX文件
    doc = Document("file.docx")
    doc_text = "\n".join([paragraph.text for paragraph in doc.paragraphs])
    
  4. 图片(JPEG、PNG)

    • 图片通常包含视觉信息,如图表、图像数据。
    • 读取方式:可以使用PIL库(也称为Pillow)来加载和处理图像。
    from PIL import Image
    
    # 读取图片文件
    image = Image.open("image.jpg")
    image.show()  # 显示图片
    
  5. 音频文件(MP3、WAV)

    • 音频数据常用于语音分析和自然语言处理。
    • 读取方式:可以使用librosapydub等库。
    import librosa
    
    # 读取音频文件
    audio_data, sample_rate = librosa.load("audio.wav", sr=None)
    
  6. 视频文件(MP4、AVI)

  • 视频文件结合了图像和音频信息,可用于视觉和音频的多模态分析。
  • 读取方式:可以使用cv2(OpenCV)库来逐帧处理视频。
import cv2

# 读取视频文件
video = cv2.VideoCapture("video.mp4")
while video.isOpened():
    ret, frame = video.read()
    if not ret:
        break
    # 处理每一帧
video.release()
  1. 网页数据(HTML)

    • 网页数据通常是包含HTML标签的非结构化文本。
    • 读取方式:可以使用requestsBeautifulSoup库来提取和解析网页内容。
    import requests
    from bs4 import BeautifulSoup
    
    # 读取网页内容
    url = "https://example.com"
    response = requests.get(url)
    soup = BeautifulSoup(response.content, "html.parser")
    web_text = soup.get_text()
    

PS:除文本文档外,引入其他文件类型均需要安装对应的库,可通过如下代码安装:

pip install XXX(你需要安装的库名)

这些非结构化数据的读取方法为AI提供了多样化的数据源。通过整合这些数据,我们的AI系统能够从多个维度获取信息,提升回答的广度和准确性。

2. 读取后的处理

读取非结构化数据后,可以根据需求对数据进行进一步处理,以便于AI模型的理解和使用(如果你常用Python做数据处理,可以跳过本节)。以下是对不同类型数据的常见处理方法:

  1. 文本数据(TXT、CSV等) 文本清理:去除特殊字符、停用词、标点符号,或者将所有字符转换为小写。 分词:将句子分解为单词或词组,以便后续嵌入或模型输入。 标记化处理:将文本转换为模型可理解的向量(通常使用预训练模型进行嵌入)。

    import re
    from nltk.tokenize import word_tokenize
    from sklearn.feature_extraction.text import CountVectorizer
    
    # 文本清理
    def clean_text(text):
        text = re.sub(r'\W', ' ', text)  # 去除非字母字符
        text = text.lower()  # 转为小写
        return text
    
    cleaned_text = clean_text(content)
    tokens = word_tokenize(cleaned_text)
    
  2. PDF数据 文本抽取:将PDF中的文字内容提取为字符串。 页码分割:如果内容较长,可以按页分割或按章节分段,便于检索和处理。 结构化:识别标题、段落等结构(如使用正则表达式或机器学习方法)以增强对内容的理解。

    # 按页处理PDF文本
    pdf_pages = [clean_text(page) for page in pdf_text.split('\n\n')]
    
  3. Word文档(DOCX) 格式解析:提取文档中的标题、段落、表格、图像等。 内容标记:根据内容的结构创建标签,帮助AI理解文档的层次和语义。

    # 将每段作为一个单独的文本片段
    paragraphs = [clean_text(p.text) for p in doc.paragraphs if p.text]
    
  4. 图片数据(JPEG、PNG) 图像预处理:将图像调整为统一大小、灰度化、去噪等。 特征提取:使用卷积神经网络(如ResNet或VGG)提取图像特征,以向量形式表示。 OCR识别:如果图片中包含文本,可以使用OCR(光学字符识别)工具提取文字信息(如pytesseract库)。

    import pytesseract
    
    # OCR识别图像文字
    text_from_image = pytesseract.image_to_string(image)
    
  5. 音频数据(MP3、WAV) 采样和格式转换:将音频采样为统一的采样率,转换为模型所需格式。 特征提取:提取梅尔频谱图、MFCC(梅尔频率倒谱系数)等特征,用于语音或音频模型分析。 分段处理:将长音频分割成短片段,以便于处理和分析。

    import librosa
    
    # 提取MFCC特征
    mfccs = librosa.feature.mfcc(y=audio_data, sr=sample_rate, n_mfcc=13)
    
  6. 视频数据(MP4、AVI) 帧提取:将视频分解为帧,提取出图像序列。 特征提取:可以从每帧中提取图像特征或在时间轴上分析帧序列的变化。 音频分离:如果需要分析音频,可以提取视频中的音频并处理。

    # 将视频分割为帧
    frames = []
    while video.isOpened():
        ret, frame = video.read()
        if not ret:
            break
        frames.append(frame)
    
  7. 网页数据(HTML) HTML解析:使用BeautifulSoup等工具解析HTML结构,提取有用的内容,如标题、正文、表格等。 去标:去除HTML标签,保留纯文本。 结构化数据抽取:提取特定数据点(如价格、日期、联系方式等),通常结合正则表达式或XPath等方法。

    from bs4 import BeautifulSoup
    
    # 从HTML提取纯文本
    soup = BeautifulSoup(web_text, "html.parser")
    plain_text = soup.get_text()
    

综合示例

处理不同类型的非结构化数据后,可以将所有处理过的内容存入一个统一的数据结构,如列表或数据库,然后用于训练或实时查询:

data_sources = {
    "text": cleaned_text,
    "pdf": pdf_pages,
    "docx": paragraphs,
    "image_text": text_from_image,
    "audio_features": mfccs,
    "video_frames": frames,
    "web_content": plain_text
}

这种方法有助于统一处理结果,提升AI对多类型数据的理解和响应能力。

3. 数据读取后的存储

接下来,为了让AI更高效地使用这些非结构化数据,我们需要将处理后的数据存储在合适的数据库或文件系统中。以下是几种常见的存储方式和代码示例:

  1. 使用向量数据库存储嵌入

    • 向量数据库(如QdrantFAISS)非常适合存储文本、图像、音频等数据的嵌入(向量表示),便于后续快速相似度查询。
    • 存储方式:使用Qdrant存储文档的嵌入向量。
    from qdrant_client import QdrantClient
    from sentence_transformers import SentenceTransformer
    
    # 初始化Qdrant客户端
    client = QdrantClient(":memory:")  # 本地内存存储
    
    # 初始化嵌入模型
    model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
    
    # 文本数据列表
    documents = ["文本1", "文本2", "文本3"]
    
    # 生成嵌入并存储
    embeddings = [model.encode(doc) for doc in documents]
    client.upload_collection(
        collection_name="my_documents",
        vectors=embeddings,
        payload=documents
    )
    
  2. 关系型数据库(SQL)存储结构化和非结构化数据元信息

    • 对于非结构化数据文件(如PDF、DOCX、图片),可以将其存储路径和相关元信息(如文件名、类别、日期)存入关系型数据库(如SQLite或MySQL),方便检索。
    • 存储方式:使用SQLite存储文档信息。
    import sqlite3
    
    # 创建数据库并连接
    conn = sqlite3.connect("ai_data.db")
    cursor = conn.cursor()
    
    # 创建表格
    cursor.execute('''CREATE TABLE IF NOT EXISTS documents (
                      id INTEGER PRIMARY KEY,
                      file_name TEXT,
                      file_path TEXT,
                      file_type TEXT,
                      processed_content TEXT)''')
    
    # 插入数据
    data = ("example.pdf", "/path/to/example.pdf", "pdf", "已处理的文本内容")
    cursor.execute("INSERT INTO documents (file_name, file_path, file_type, processed_content) VALUES (?, ?, ?, ?)", data)
    
    # 提交并关闭连接
    conn.commit()
    conn.close()
    
  3. 文件存储系统(如本地文件系统或云存储)存储大文件

    • 对于图像、视频和音频等大型文件,适合将其存储在文件系统或云存储中(如AWS S3、Google Cloud Storage),并在数据库中记录文件路径和元信息。
    • 存储方式:保存文件并记录路径信息。
    import os
    import sqlite3
    
    # 保存文件路径和文件类型信息
    file_name = "example.jpg"
    file_path = f"/path/to/{file_name}"
    file_type = "image"
    
    # 将文件路径存储在SQLite中
    conn = sqlite3.connect("ai_data.db")
    cursor = conn.cursor()
    cursor.execute("INSERT INTO documents (file_name, file_path, file_type) VALUES (?, ?, ?)", (file_name, file_path, file_type))
    conn.commit()
    conn.close()
    

除了上述常见的存储方式外,我们同样也可以通过其他一些方式来进行我们的数据的存储,给AI读取,例如:NoSQL数据库(如MongoDB)存储非结构化和半结构化数据、Elasticsearch存储文本内容以便全文检索、统一数据存储与检索函数

这样,通过使用适当的存储方法和数据库,AI系统可以有效管理不同类型的数据源,便于AI模型在处理自然语言问题时进行快速检索和准确回答。

4. AI如何使用这些数据来回答

在构建智能问答系统时,我们应当如何教AI面对用户提出的问题呢?如何处理才能让AI理解呢?如何获取与问题相关的文档信息呢?接下来我们就将详细描述此过程。

步骤概述

  1. 问题向量化:将用户问题转换为向量表示。
  2. 相似度搜索:在向量数据库中进行相似度搜索,找到与问题向量最接近的文档向量。
  3. 结果返回:提取最相关的文档信息,用于生成回答。

实际上相似度搜索这一部分,简单来说就是机器学习中的分类问题,将你这个问题分到哪一个相关问题上,可以自行尝试使用一些类似决策树的方法增强问题回答的准确性。

代码示例:使用Qdrant进行相似度搜索

  1. 数据预处理和存储

首先,将内部文档处理为向量并存储到向量数据库中。例如,使用SentenceTransformer生成嵌入并存储在Qdrant中。

from qdrant_client import QdrantClient
from sentence_transformers import SentenceTransformer

# 初始化Qdrant客户端
client = QdrantClient(":memory:")  # 本地内存存储

# 加载嵌入模型
embedding_model = SentenceTransformer('paraphrase-MiniLM-L6-v2')

# 示例文档列表
documents = ["这是第一个文档内容", "这是第二个文档内容", "这是第三个文档内容"]

# 生成并存储嵌入
embeddings = [embedding_model.encode(doc) for doc in documents]
payloads = [{"content": doc} for doc in documents]

# 创建并上传嵌入集合
client.upload_collection(
    collection_name="my_documents",
    vectors=embeddings,
    payload=payloads
)
  1. 将用户问题转换为向量

用户提出问题时,将问题转换为向量表示,以便进行相似度搜索。

# 将用户问题转化为向量
query = "这是什么文档?"
query_vector = embedding_model.encode(query)
  1. 在向量数据库中进行相似度搜索

使用Qdrant的search方法进行相似度搜索,找到最相关的文档。

# 在Qdrant中进行相似度搜索
search_results = client.search(
    collection_name="my_documents",
    query_vector=query_vector,
    limit=3  # 返回最接近的3个文档
)

# 打印搜索结果
for result in search_results:
    print("相关文档:", result.payload["content"])
    print("相似度分数:", result.score)
  1. 结果处理和返回

可以将搜索结果按相似度分数排序并返回最高的一个或多个结果,结合其内容生成最终回答。

# 提取最高相关度的文档
top_document = search_results[0].payload["content"]
print("最相关的文档内容:", top_document)

优化方法

  • 可以增加limit参数,限制返回的文档数量。
  • 可以对搜索结果进一步处理,例如,针对文档内容的上下文补充,或将多个相关文档的信息整合,形成更准确的回答。
  • 若使用在生产环境,可选择存储在持久性数据库或进行索引优化,提高响应速度。

总结

接下来给大家个AI总结

在AI系统的开发过程中,构建和利用知识库至关重要,这使得AI能够处理和回答各种复杂问题。以下是本次学习的总结要点:

  1. 知识库构建:AI需要一个多类型的数据源来有效地回答问题,包括非结构化数据(如PDF、文档、图像等)、结构化数据(如SQL数据库)、以及代码资源等。通过丰富的数据源,AI的知识储备更加全面,从而提升了回答的准确性和专业性。

  2. 非结构化数据读取与处理

    • 各种非结构化数据(如文本、PDF、Word文档、图片、音频、视频和网页数据)都需要特定的库和方法来进行读取。
    • 在数据读取后,通过清理、分词、OCR识别、特征提取等方法进一步处理,使得数据格式适合AI模型的理解。
  3. 数据存储

    • 处理后的数据可以存储在多种存储系统中,选择合适的存储方式非常重要。
    • 向量数据库(如Qdrant和FAISS)适合存储嵌入向量,支持快速相似度查询。关系型数据库(如SQLite)和NoSQL数据库(如MongoDB)适合存储元信息和半结构化数据。文件系统或云存储适合存储较大的文件(如图像和视频)。
    • 通过多样化的存储方式,AI系统可以高效管理不同的数据源,以便快速检索和利用数据。
  4. AI的相似度搜索

    • 为了回答用户的问题,首先需要将问题转化为向量。
    • 通过在向量数据库中进行相似度搜索,找到与问题最相关的文档,然后提取该文档内容并返回结果。
    • 这种基于相似度的搜索方式有助于AI在大量数据中找到最相关的信息,回答更准确。
  5. 优化与扩展

    • 相似度搜索可通过多种优化方法(如限制返回的文档数量、上下文补充)提升回答质量。
    • 如果应用于生产环境,可进一步考虑数据库持久性、索引优化和搜索算法改进,以确保响应速度和准确性。

通过这一整套方法,AI系统能够在用户提出问题时,从丰富的数据源中找到最相关的信息,提供有逻辑且专业的回答。