AI第二课
引言
在AI开发的第二课中,我们的核心任务是明确AI的知识储备。就像人类需要知识储备才能回答问题一样,AI也需要丰富的知识库来提供有效的回答。为了实现这一目标,我们需要为AI构建一个全面的数据源。这些数据源可以包括多种类型:
- 非结构化数据:如PDF、文档等自由格式的数据;
- 结构化数据:如SQL数据库等有组织的、清晰结构的数据;
- 代码资源:如Python、Java等编程语言的代码。
通过整合这些不同的数据源,AI能够更好地理解问题并提供准确、专业的回答。接下来,我们将详细探讨如何为AI提供非结构化的数据源,以增强其回答能力。
1. 非结构化数据的类型以及其读取方式
非结构化数据是指那些没有固定结构或模式的数据,如文本、图像、音频和视频等。在AI应用中,常见的非结构化数据类型及其读取方法如下:
-
文本文件(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") -
PDF文件
- PDF文件包含丰富的文字内容,并且常用于存储报告、研究论文等文档,也是我们最常接受到的一种文件形式
- 读取方式:我们无法直接读取PDF,需要使用外部库
PyPDF2或pdfplumber库来提取文字内容。
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() -
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]) -
图片(JPEG、PNG)
- 图片通常包含视觉信息,如图表、图像数据。
- 读取方式:可以使用
PIL库(也称为Pillow)来加载和处理图像。
from PIL import Image # 读取图片文件 image = Image.open("image.jpg") image.show() # 显示图片 -
音频文件(MP3、WAV)
- 音频数据常用于语音分析和自然语言处理。
- 读取方式:可以使用
librosa或pydub等库。
import librosa # 读取音频文件 audio_data, sample_rate = librosa.load("audio.wav", sr=None) -
视频文件(MP4、AVI)
- 视频文件结合了图像和音频信息,可用于视觉和音频的多模态分析。
- 读取方式:可以使用
cv2(OpenCV)库来逐帧处理视频。
import cv2
# 读取视频文件
video = cv2.VideoCapture("video.mp4")
while video.isOpened():
ret, frame = video.read()
if not ret:
break
# 处理每一帧
video.release()
-
网页数据(HTML)
- 网页数据通常是包含HTML标签的非结构化文本。
- 读取方式:可以使用
requests和BeautifulSoup库来提取和解析网页内容。
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做数据处理,可以跳过本节)。以下是对不同类型数据的常见处理方法:
-
文本数据(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) -
PDF数据 文本抽取:将PDF中的文字内容提取为字符串。 页码分割:如果内容较长,可以按页分割或按章节分段,便于检索和处理。 结构化:识别标题、段落等结构(如使用正则表达式或机器学习方法)以增强对内容的理解。
# 按页处理PDF文本 pdf_pages = [clean_text(page) for page in pdf_text.split('\n\n')] -
Word文档(DOCX) 格式解析:提取文档中的标题、段落、表格、图像等。 内容标记:根据内容的结构创建标签,帮助AI理解文档的层次和语义。
# 将每段作为一个单独的文本片段 paragraphs = [clean_text(p.text) for p in doc.paragraphs if p.text] -
图片数据(JPEG、PNG) 图像预处理:将图像调整为统一大小、灰度化、去噪等。 特征提取:使用卷积神经网络(如ResNet或VGG)提取图像特征,以向量形式表示。 OCR识别:如果图片中包含文本,可以使用OCR(光学字符识别)工具提取文字信息(如
pytesseract库)。import pytesseract # OCR识别图像文字 text_from_image = pytesseract.image_to_string(image) -
音频数据(MP3、WAV) 采样和格式转换:将音频采样为统一的采样率,转换为模型所需格式。 特征提取:提取梅尔频谱图、MFCC(梅尔频率倒谱系数)等特征,用于语音或音频模型分析。 分段处理:将长音频分割成短片段,以便于处理和分析。
import librosa # 提取MFCC特征 mfccs = librosa.feature.mfcc(y=audio_data, sr=sample_rate, n_mfcc=13) -
视频数据(MP4、AVI) 帧提取:将视频分解为帧,提取出图像序列。 特征提取:可以从每帧中提取图像特征或在时间轴上分析帧序列的变化。 音频分离:如果需要分析音频,可以提取视频中的音频并处理。
# 将视频分割为帧 frames = [] while video.isOpened(): ret, frame = video.read() if not ret: break frames.append(frame) -
网页数据(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更高效地使用这些非结构化数据,我们需要将处理后的数据存储在合适的数据库或文件系统中。以下是几种常见的存储方式和代码示例:
-
使用向量数据库存储嵌入
- 向量数据库(如
Qdrant、FAISS)非常适合存储文本、图像、音频等数据的嵌入(向量表示),便于后续快速相似度查询。 - 存储方式:使用
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 ) - 向量数据库(如
-
关系型数据库(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() -
文件存储系统(如本地文件系统或云存储)存储大文件
- 对于图像、视频和音频等大型文件,适合将其存储在文件系统或云存储中(如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理解呢?如何获取与问题相关的文档信息呢?接下来我们就将详细描述此过程。
步骤概述
- 问题向量化:将用户问题转换为向量表示。
- 相似度搜索:在向量数据库中进行相似度搜索,找到与问题向量最接近的文档向量。
- 结果返回:提取最相关的文档信息,用于生成回答。
实际上相似度搜索这一部分,简单来说就是机器学习中的分类问题,将你这个问题分到哪一个相关问题上,可以自行尝试使用一些类似决策树的方法增强问题回答的准确性。
代码示例:使用Qdrant进行相似度搜索
- 数据预处理和存储
首先,将内部文档处理为向量并存储到向量数据库中。例如,使用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
)
- 将用户问题转换为向量
用户提出问题时,将问题转换为向量表示,以便进行相似度搜索。
# 将用户问题转化为向量
query = "这是什么文档?"
query_vector = embedding_model.encode(query)
- 在向量数据库中进行相似度搜索
使用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)
- 结果处理和返回
可以将搜索结果按相似度分数排序并返回最高的一个或多个结果,结合其内容生成最终回答。
# 提取最高相关度的文档
top_document = search_results[0].payload["content"]
print("最相关的文档内容:", top_document)
优化方法
- 可以增加
limit参数,限制返回的文档数量。 - 可以对搜索结果进一步处理,例如,针对文档内容的上下文补充,或将多个相关文档的信息整合,形成更准确的回答。
- 若使用在生产环境,可选择存储在持久性数据库或进行索引优化,提高响应速度。
总结
接下来给大家个AI总结
在AI系统的开发过程中,构建和利用知识库至关重要,这使得AI能够处理和回答各种复杂问题。以下是本次学习的总结要点:
-
知识库构建:AI需要一个多类型的数据源来有效地回答问题,包括非结构化数据(如PDF、文档、图像等)、结构化数据(如SQL数据库)、以及代码资源等。通过丰富的数据源,AI的知识储备更加全面,从而提升了回答的准确性和专业性。
-
非结构化数据读取与处理:
- 各种非结构化数据(如文本、PDF、Word文档、图片、音频、视频和网页数据)都需要特定的库和方法来进行读取。
- 在数据读取后,通过清理、分词、OCR识别、特征提取等方法进一步处理,使得数据格式适合AI模型的理解。
-
数据存储:
- 处理后的数据可以存储在多种存储系统中,选择合适的存储方式非常重要。
- 向量数据库(如Qdrant和FAISS)适合存储嵌入向量,支持快速相似度查询。关系型数据库(如SQLite)和NoSQL数据库(如MongoDB)适合存储元信息和半结构化数据。文件系统或云存储适合存储较大的文件(如图像和视频)。
- 通过多样化的存储方式,AI系统可以高效管理不同的数据源,以便快速检索和利用数据。
-
AI的相似度搜索:
- 为了回答用户的问题,首先需要将问题转化为向量。
- 通过在向量数据库中进行相似度搜索,找到与问题最相关的文档,然后提取该文档内容并返回结果。
- 这种基于相似度的搜索方式有助于AI在大量数据中找到最相关的信息,回答更准确。
-
优化与扩展:
- 相似度搜索可通过多种优化方法(如限制返回的文档数量、上下文补充)提升回答质量。
- 如果应用于生产环境,可进一步考虑数据库持久性、索引优化和搜索算法改进,以确保响应速度和准确性。
通过这一整套方法,AI系统能够在用户提出问题时,从丰富的数据源中找到最相关的信息,提供有逻辑且专业的回答。