构建作文批改系统
一: 词向量
词向量(Word Embedding)是自然语言处理(NLP)中用于将词语映射到低维连续向量空间的技术。其核心思想是通过数学表示捕捉词语的语义和语法特征,使计算机能够理解和处理自然语言。
词向量的优势:
-
降维效果:通过词向量,原本稀疏的高维词汇表被压缩为低维的稠密向量,减少了计算复杂度。
-
捕捉语义关系:通过向量空间中的几何关系(如距离、方向)表达词语间的关联。
例如:语义相似性:
猫
和狗
的向量距离较近。 类比关系:
国王 - 男 + 女 ≈ 王后
。
构建词向量的方法:
- 使用商业化的Embedding API。
- 使用本地的嵌入模型(本项目采用此方法)
二:向量数据库
向量数据库是用于高效计算和管理大量向量数据的解决方案。在向量数据库中,数据被表示为向量形式,每个向量代表一个数据项。这些向量可以是数字、文本、图像或其他类型的数据。
主流的向量数据库:chroma,Weaviate,Qdrant。
本项目将使用Chroma。
三:整体流程
注:此部分实现仅用于作文批改系统的举例例证,名言警句等方面。
主题为RAG操作。
-
获取query即用户作文句子(暂定,关于长度问题仍需讨论)。
-
加载读取素材库中的文档
-
分割文档资料,将文本向量化存入chorma持久化保存(所以2,3只需执行一次,除非未来需要扩充素材库)
-
query向量化,匹配与其最相似的结果k个
-
将结果,句子,上下文合并为prompt
-
提交给大模型完成例证/名言警句扩写
一:预备阶段(注:对于上述阶段2,3。此部分会较为简略)
1.数据处理:使用 LangChain 的 PyMuPDFLoader 来读取知识库的 PDF 文件。
from langchain.document_loaders.pdf import PyMuPDFLoader
# 创建一个 PyMuPDFLoader Class 实例,输入为待加载的 pdf 文档路径
loader = PyMuPDFLoader("../pdf文件路径.pdf")
# 调用 PyMuPDFLoader Class 的函数 load 对 pdf 文件进行加载
pdf_pages = loader.load()
# page变量类型为list,每一个元素为一个文档
或加载txt文件(推荐,因其简单):
# 使用UnstruturedFileLoader
from langchain_community.document_loaders import UnstructuredMarkdownLoader, PyMuPDFLoader, UnstructuredFileLoader
loaders.append(UnstructuredFileLoader(
file_path=file,
mode="elements",
strategy="fast"
)
2.数据清洗与文档分割
暂略,此处后面测试优化时再来关注
3.搭建并使用Chroma向量库
分割文档:
chunk_size
即分割单位。
overlap
为chunk间重叠的部分,这是为了保证内容的连贯性
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=300, # 增大chunk_size获取更多上下文
chunk_overlap=75,
separators=["\n\n", "\n", "。", "!", "?", ";", "……", "…", ""]
)
split_docs = text_splitter.split_documents(docs)
split_docs = filter_complex_metadata(split_docs)
# document:即素材库
# embedding :用来处理文本,产生词向量的模型。
vectordb = Chroma.from_documents(
documents=split_docs,
embedding=get_embedding(embedding_model,MODELS_PATH),
persist_directory=persist_dir
)
vectordb.persist() # 显式持久化
return vectordb
get_embedding
函数:这里我们使用的是免费开源的monkai-m3e模型。(需下载到本地)
def get_embedding(model_type: str,path):
if model_type == 'm3e':
return HuggingFaceEmbeddings(
model_name=path,
# model_kwargs={'device': 'cpu'}, # 使用CPU推理
# encode_kwargs={'normalize_embeddings': True} # 标准化向量
)
else:
raise ValueError(f"不支持的嵌入模型类型: {model_type}")
4.测试
使用test_queries = ["要勇敢做人", "如何保持心理健康", "科技发展的影响"]
来测试:
结果如下(部分):
测试查询: '要勇敢做人' 检索到 3 条相关结果: [结果 1] 来源:./documents\高考作文经典素材.txt 内容片段:第一篇 人生信念一次成功就够了... --------------------------------------------------------------------------------
可见素材已经成功持久化存储,并可根据文本向量相似度来查询。
此时结果比较混乱,后续还需优化和测试。主要在数据处理部分。