使用RAG(检索增强生成)来释放更准确和有意义的AI输出。
这张照片由 No Revisions 在 Unsplash 拍摄。
由 Eduardo Rojas Oviedo,和 Ezequiel Lanza 联合检索增强生成(RAG)因其能增强大型语言模型的理解能力而变得流行,提供上下文并帮助防止模型产生幻觉。RAG流程包括几个步骤,从分块摄入文档到提取上下文,再到用这些上下文来提示LLM。虽然已知可以显著改善预测结果,但RAG偶尔也会导致错误。文档的摄入方式在这个过程中非常重要。例如,如果我们的“上下文文档”包含拼写错误或对LLM来说不常见的字符,如表情符号,这可能会让LLM误解这些提供的上下文。
在这篇文章里,我们将展示四种常用的自然语言处理(NLP)技术,用于在文本被处理并拆分成片段以供LLM进一步处理之前进行清洗。我们还将说明这些技术如何显著提升模型对提示的反应。
这是根据RAG-Survey 中的RAG过程步骤改编的。
为什么整理文档很重要?在将任何文本输入到任何机器学习算法之前,清理文本是标准做法。这无论是使用监督学习,无监督算法,还是为生成式AI(GAI)模型构建上下文时都很重要。这有助于使文本保持良好状态。
· 确保准确性: 消除错误和保持一致性,可以减少模型混淆或产生幻觉的风险。
· 提升质量: 更干净、可靠的数据确保模型使用可靠和一致的信息,帮助我们的模型准确地进行推理。
· 让分析更方便:干净的数据易于解释和分析。例如,用纯文本训练的模型可能看不懂表格数据,比如。
通过清理我们的数据——特别是unstructured data——我们为模型提供了可靠且相关的上下文,这有助于改善生成,减少幻觉,并提高系统速度和性能,由于大量信息处理,等待时间会更长。
我们怎么才能把数据清洗干净呢?为了帮助你构建数据清洗工具包,我们将介绍四种NLP及其如何帮助模型。
第一步:数据清理及去除噪音我们将从移除无意义的符号或字符开始,例如抓取时遇到的HTML标签、XML标签、JSON、表情符号和标签(如#话题)。不必要的字符会让模型困惑,并增加上下文令牌的数量,从而增加计算成本。
我们知道没有一种通用的解决方案,我们会根据不同问题和文本类型采用常用的清理技术来适应。
· 分词处理: 将文本拆分成单独的词元或标记。
· 去除杂项: 删除不必要的符号、表情、话题标签和特殊字符。
· 规范化: 将文本统一转换为小写,以保持一致。
· 移除停用词: 删除通常没有实际意义的常见词汇,如“a”、“in”、“of”和“the”,以提高文本的简洁度,从而让文本更加简洁自然。
· 词形归一化或词干提取: 将单词还原为它们的基本或根形式。
我们拿这条推文做个例子:
“我喜欢编程!😊 #Python编程真好玩!✨ 🐍 让我们开始清理文本吧 🧹”
尽管我们都明白这个意思,但让我们通过应用常用的Python技术来简化它,以便模型更容易理解。下面的代码片段以及本文中的所有其他代码都是通过ChatGPT的帮助生成的。
import re
import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
s
from nltk.stem import WordNetLemmatizer
# 示例文本包含表情符号、话题标签和其他字符
text = "我爱编码!😊 #PythonProgramming 很有趣!🐍✨ 让我们清理一些文本 🧹"
# 分词
tokens = word_tokenize(text)
# 清理干扰
cleaned_tokens = [re.sub(r'[^\w\s]', '', token) for token in tokens]
# 正则化(转换为小写)
cleaned_tokens = [token.lower() for token in cleaned_tokens]
# 去除停用词
stop_words = set(stopwords.words('english'))
cleaned_tokens = [token for token in cleaned_tokens if token not in stop_words]
# 词形还原
lemmatizer = WordNetLemmatizer()
cleaned_tokens = [lemmatizer.lemmatize(token) for token in cleaned_tokens]
print(cleaned_tokens)
# 输出:
# ['love', 'coding', 'pythonprogramming', 'fun', 'clean', 'text']
这个过程已经帮我们清除了一些不重要的字符,现在我们有了一个干净且有意义的文本内容:[‘love’, ‘coding’, ‘pythonprogramming’, ‘fun’, ‘clean’, ‘text’]。
第二步:文本的标准处理和统一接下来,我们应该始终优先考虑文本的一致性和流畅性。这一点对于确保准确检索和提升性能至关重要。在以下的 Python 代码示例中,让我们扫描我们的文本输入以查找拼写错误和其他一致性错误。比如,这些可能导致错误和性能下降的拼写错误和其他问题。
import re
# 包含拼写错误的示例文本
text_with_errors = """But ’s not oherence about more language oherence .
Other important aspect is ensuring accurte retrievel by oherence product name spellings.
Additionally, refning descriptions oherenc the oherence of the contnt."""
# 一个用于纠正拼写错误的函数
def correct_spelling_errors(text):
# 拼写错误及其正确拼写的字典
spelling_corrections = {
“ oherence ”: “everything”,
“ oherence ”: “refinement”,
“accurte”: “accurate”,
“retrievel”: “retrieval”,
“ oherence ”: “correcting”,
“refning”: “refining”,
“ oherenc”: “enhances”,
“ oherence”: “coherence”,
“contnt”: “content”,
}
# 遍历字典中的每一项,并用正确的拼写替换拼写错误
for mistake, correction in spelling_corrections.items():
text = re.sub(mistake, correction, text)
return text
# 在示例文本中纠正拼写错误,并得到清理后的文本
cleaned_text = correct_spelling_errors(text_with_errors)
print(cleaned_text)
# 输出结果
# 但这并不是关于更多的语言优化。
# 另一个重要方面是确保通过纠正产品名称拼写来准确检索。
# 此外,优化描述可以增强内容的一致性。
通过一个连贯且一致的文本表示,我们的模型现在可以生成准确且符合上下文的相关回答。这一过程还支持语义搜索,能提取最合适的上下文片段,特别是在RAG的上下文中。
步骤三:元数据管理元数据收集,例如识别重要的关键字和实体,使我们能够识别文本中的元素,从而提高语义搜索结果的质量,尤其是在像内容推荐系统这样的企业应用中。这个过程为模型提供了额外的背景信息,通常需要来改善RAG性能。让我们将这一步应用到另一个Python示例。
导入 spacy 和 json
# 加载英语语言模型
nlp = spacy.load("en_core_web_sm")
# 包含元数据候选者的示例文本
text = """在一篇题为《2024年十大科技趋势》的博客文章中,
约翰·道讨论了人工智能和机器学习在各行业中的兴起。文章提到了谷歌和微软
等公司作为人工智能研究的先驱。此外,它还强调了自然语言处理和计算机视觉
等新兴技术。””"""
# 使用spaCy处理文本
doc = nlp(text)
# 提取命名实体及其标签
meta_data = [{"text": ent.text, "label": ent.label_} for ent in doc.ents]
# 将元数据转换为JSON格式
meta_data_json = json.dumps(meta_data)
print(meta_data_json)
# 输出结果
"""
[
{"text": "2024", "label": "DATE"},
{"text": "约翰·道", "label": "PERSON"},
{"text": "谷歌", "label": "组织"},
{"text": "微软", "label": "组织"},
{"text": "AI", "label": "组织"},
{"text": "自然语言处理", "label": "组织"},
{"text": "计算机视觉", "label": "组织"}
]
"""
这段代码显示了spaCy的实体识别能力如何识别出文本中的日期、人物、组织等重要实体。这有助于RAG应用更好地理解上下文和单词间的关联。
第4步:处理背景信息当你与大规模语言模型合作时,你可能需要处理多种语言或管理涉及各种主题的大量文档,这可能会让你的模型难以理解和处理。让我们来看看两种可以帮助你的模型更好地理解和处理这些数据的方法。
我们先来做个语言翻译的例子。下面的代码使用Google Translation API进行了翻译,将英文 "Hello, how are you?" 翻译成西班牙语。此外,“Hello, how are you?” 可以翻译成中文 “你好,你好吗?” 以帮助中文读者更好地理解。
首先,从googletrans导入Translator
# 原始文本内容
text = "Hello, how are you?"
# 翻译文本
translator = Translator()
translated_text = translator.translate(text, src='en', dest='es').text
print("原始文本:", text)
print("翻译后的文本:", translated_text)
主题模型 包括像数据聚类这样的技术,就像是整理一个杂乱的房间,将物品分类存放,帮助模型快速识别文档的主题并处理大量信息。潜在狄利克雷分配(LDA,Latent Dirichlet Allocation 的缩写),最常用的自动化主题建模方法,是一种统计模型,通过仔细分析词模式来帮助发现文本中的隐藏主题。
接下来我们看一个例子,我们将使用sklearn处理一组文档并找出关键主题。
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
# 示例文档
documents = [
"机器学习是人工智能的一个子集。",
"自然语言处理涉及分析并理解人类语言。",
"深度学习算法模仿人脑的结构和功能。",
"情感分析旨在判断文本的情感倾向。"
]
# 将文本转换成数值特征向量
vectorizer = CountVectorizer(stop_words='english')
X = vectorizer.fit_transform(documents)
# 使用LDA进行主题建模
lda = LatentDirichletAllocation(n_components=2, random_state=42)
lda.fit(X)
# 展示主题
for topic_idx, topic in enumerate(lda.components_):
print("主题 %d:" % (topic_idx + 1))
print(" ".join([vectorizer.get_feature_names()[i] for i in topic.argsort()[:-6:-1]]))
# 输出:
#
#主题 1:
#机器学习 子集 人工智能
#主题 2:
#自然语言处理 涉及 分析 理解
如果你想探索更多主题建模方法,我们建议从这些开始着手:
这里可以列举一些具体的技术或资源,但由于原文中未给出具体内容,所以这里保持原样。
· NMF(非负矩阵分解) 特别适合处理像图像这样不能有负值的数据。当你需要清晰易懂的结果时,它就显得特别有用。例如,在图像处理中,NMF 帮助提取特征,而不会因为负值而混淆。
· 潜在语义分析(LSA) 当有大量的文本分布在多个文档中,希望找到单词和文档之间的联系时,表现尤为出色。LSA 使用 奇异值分解(SVD) 来识别术语与文档之间的语义关系,有助于简化诸如按相似性排序文档和检测抄袭等任务。
· 层次狄利克雷过程(HDP) 可以帮助你快速处理大量数据,并在你不确定有多少主题时识别文档中的主题。作为LDA的扩展,HDP允许无限的主题数量和更灵活的建模。它能识别文本数据中的层次结构,适用于理解学术论文或新闻文章中主题的组织方式。
· 潜在语义分析(PLSA) 可以帮助判断一篇文档谈论某个话题的概率,这在建立推荐系统时很有帮助,该系统可以根据过去的交互提供建议。
示例演示:清理 GAI系统文本输入内容让我们通过一个例子来总结一下。在这个演示中,我们使用了ChatGPT来生成一个对话。我们将对这段对话做一些基本的清理工作,来展示这些做法如何确保结果的可靠性和一致性。
合成文本 = """
Sarah (S): 对技术感兴趣的人
Mark (M): AI专家
S: 嘿,马克!最近还好吗?听说最新的生成式AI(GA)进展了吗?
M: 嘿,莎拉!是的,最近一直在深入研究生成式AI。真是令人着迷,它正在塑造技术的未来!
S: 完全同意!而且生成式AI正在各行各业掀起波澜。你认为它的重要性和意义体现在哪里?
M: 嗯,特别是检索增强生成式(RAG),它正在改变内容生成的方式。它不仅仅是重复信息,而是生成上下文相关且引人入胜的内容。
S: 对的!随着机器学习变得越来越复杂,我们似乎看到了无限的可能性。
M: 没错!随着生成式预训练变压器(GPT)等机器学习算法的进步,我们正见证AI生成内容前所未有的创造力。
S: 那关于生成式AI中的偏见和伦理问题呢?
M: 哦,这是一个老问题!虽然确实生成式AI可能会无意中延续训练数据中的偏见问题,但是像对抗训练(AT)这样的技术正在努力减轻这些问题。
S: 听起来很有意思!那么你认为生成式AI在未来几年会朝哪个方向发展呢?
M: 我认为我们将会见证越来越多的应用程序利用生成式AI来提供个性化体验。从虚拟助手到内容创作工具,生成式AI将在我们的日常生活中无处不在,逐渐成为我们生活中的一部分。
S: 太棒了!想象一下,根据我们的喜好定制的AI驱动的虚拟伴侣。
M: 确实!随着自然语言处理(NLP)和计算机视觉的进步,这些虚拟伴侣将比以往任何时候都更加直观且更逼真。
S: 我迫不及待地想看看未来会是什么样子!
M: 同意!现在是从事AI领域工作的绝佳时机。
S: 完全同意!非常感谢你分享这些见解,马克。
M: 任何时候,莎拉。让我们一起推动生成式AI的界限,共同探索更多可能!
S: 当然!马克,下次见!
M: 保重,莎拉!
"""
第一步:基本清理工作
首先,让我们从对话里去掉表情符号、标签和Unicode字符。
# 示例文本,包含表情符号、标签和 unicode 字符
# 词元化
tokens = word_tokenize(text)
# 去除噪音
cleaned_tokens = [re.sub(r'[^\w\s]', '', token) for token in tokens]
# 规范化(转换为小写形式)
cleaned_tokens = [token.lower() for token in cleaned_tokens]
# 去除停用词
stop_words = set(stopwords.words('英语'))
cleaned_tokens = [token for token in cleaned_tokens if token not in stop_words]
# 词形还原
lemmatizer = WordNetLemmatizer()
cleaned_tokens = [lemmatizer.lemmatize(token) for token in cleaned_tokens]
print(cleaned_tokens)
准备提示
接下来,我们将设计一个提示,让模型以友好的客服代表身份回答,根据它从我们模拟对话中得到的信息。
MESSAGE_SYSTEM_CONTENT = "您是一名客服代表,帮助客户解答问题。请根据以下提供的上下文回答问题。请尽量不要修改提供的信息,以确保您的回答准确无误。如果上下文中没有相关信息,请礼貌地告诉对方您不清楚,并不要试图编造答案。"
第三步:准备互动
我们先准备好与模型的互动。在这次演示里,我们将会用到GPT-4。
def response_test(question: str, context: str, model: str = "gpt-4"): # MESSAGE_SYSTEM_CONTENT 可能是一个占位符或变量,具体取决于上下文
response = client.chat.completions.create( # 在此处"completions"保持技术术语一致
model=model,
messages=[
{
"role": "system",
"content": MESSAGE_SYSTEM_CONTENT, # MESSAGE_SYSTEM_CONTENT 可能是一个占位符或变量,具体取决于上下文
},
{"role": "user", "content": question},
{"role": "assistant", "content": context},
],
)
return response.choices[0].message.content # 在此处"choices"保持技术术语一致
步骤4:准备这个问题
接下来我们来准备这个问题。
最后来问一下模型程序一个问题看看,并对比清理前后的变化。
question1 = "在对抗训练(AT)中,有哪些具体的方法可以帮助减少生成式AI模型中的偏见?"
在清理之前,我们的模型给出了如下回应:
response = response_test(question1, synthetic_text)
print(response)
# 输出:
# 但提供的上下文中并没有提到可以用来减少生成式AI模型偏见的对抗训练(AT)的具体技术。
清洗过后,模型给出了以下回应。通过基础清洗技术,模型可以给出更全面的回答。
response = response_test(question1, new_content_string)
print(response)
# 输出:
# 对抗训练(AT)可以作为一种帮助减少生成式AI模型中的偏见的技术。不过,它并没有提到对抗训练内部的具体方法。
AI生成内容的美好未来
RAG模型具有多种优势,包括提供相关背景信息,增强AI生成结果的可靠性和一致性。这种方式显著提升了AI生成内容的准确性。
为了最大限度地发挥RAG模型的作用,在文档摄入过程中,采用强大的数据清洗技术是必不可少的。这些技术可以解决数据中的不一致现象、术语模糊以及其他潜在错误,显著提升输入数据的质量。面对更干净、更可靠的数据时,RAG模型能提供更准确且更有意义的结果,这使得RAG模型在各个领域中能够做出更好的决策并解决更复杂的问题。
作者简介你有没有尝试过别的方法来提高RAG模型的表现?告诉我们,我们会继续改进它的功能。
埃德华多·罗哈斯·奥维耶多,英特尔的平台工程师,
Eduardo Rojas Oviedo 是英特尔充满活力和创新的团队中的一名敬业的 RAG 开发者。他专注于开发前沿的 AI、机器学习和自然语言处理 (NLP) 工具,热衷于利用技术来创造有影响力的解决方案。Eduardo 的专长在于构建稳健和创新的应用程序,这些应用程序在人工智能领域开辟了新的可能性。他致力于分享知识和推进技术,这激励他在该领域不断追求卓越。
埃泽基尔·兰扎,英特尔的开源AI倡导者
Ezequiel Lanza 是英特尔 开放生态系统 团队的一名开源 AI 倡导者,他热衷于帮助人们探索充满活力的 AI 世界。他还经常在 AI 会议上发言,并创建案例、教程和指南来帮助开发人员使用开源 AI 工具。他拥有数据科学硕士学位。你可以在 X (@eze_lanza) 和领英 (/eze_lanza) 找到他。
共同学习,写下你的评论
评论加载中...
作者其他优质文章