大家好,我是Feng,欢迎和我一起探索使用AI相关技术。
一、通用大模型的现实问题
大模型应用的开发,通常基于通用大模型进行微调和训练,这样可以极大的节省训练成本。我们在使用大语言模型时,模型的响应内容,可能会出现以下的几个问题:
-
偏见:
- 训练数据中的偏见:模型在训练数据中学习到了社会、性别或种族偏见。
- 数据缺陷:训练数据包含错误信息或偏见,如重复偏见和社会偏见。
-
幻觉:
- 数据缺陷:模型训练数据中的缺陷,如错误信息和偏见,导致模型产生不真实的输出。模型本身无法判断数据中答案的权威性,因为它不具备计算等人类大脑才有的能力,更偏向推理。模型会基于已有的数据做推理,就如推理本身会出错一样,当模型推理出错误的答案时,就会表现为一本正经的胡说八道。如果给一个不了解问题和答案的人这可能就会是个灾难,所以最终还是需要具备足够领域经验和专业能力的人力去确定答案是否可用。
- 过度依赖模式:模型可能过度依赖训练数据中的某些模式,如位置接近性、共现统计数据,导致不准确的推断。
-
滞后:
- 数据更新频率:模型训练数据可能未包含最新的信息,导致输出滞后。
- 模型训练周期:模型训练和部署之间的时间差可能导致输出滞后于最新知识。
- 知识提取和整合:模型在处理分散或复杂数据时可能需要更多时间,导致回答滞后。
-
过时:
- 数据更新频率:模型可能无法及时获取和整合最新的数据,导致输出过时。比如模型训练时,某个人在抖音上已经有100万粉丝。在模型发布时,可能已经到了200万个粉丝,模型并不知道学习到的数据已经发生变化,它还是按照100万粉丝来回答。
- 模型训练周期:模型训练周期长,导致其知识库可能在部署时已经过时。
- 硬件和资源限制:资源限制可能影响模型的响应速度,进而影响输出的时效性。
二、优化方案
上述的问题,我们无法改变预训练中的数据而彻底解决,但是我们可以优化。主要有两个方法:
- 模型微调(Fine-tuning)
- 检索增强生成(RAG)
第一种方法看起来对于特定领域是更好的方法,但是对于参数极大的如OpenAI这种规模的模型来说,微调的成本也极高,而且效率极低。对于企业级专有领域智能处理场景来说,第二种方法是主要解决方式。
2.1 RAG(Retrieval-augmented generation)
RAG的全称是检索增强生成 retrieval-augmented generation,这个概念来自于 Facebook AI 部门自然语言处理研究员们在 2020 年发表的一篇论文中。所以他的出现要早于ChatGPT甚至LLM的出现,而不是因为ChatGPT后的实践方案。
简单地说,RAG是一种利用额外数据增强 LLM 知识的技术。你可能会想,哎,我把内容放在prompt里补充相关知识不就好了?这就要提到Token超限。使用过API你一定会遇到token数量限制的报错。假如你需要从一本小说里找到某个答案,而那个小说太长了,这就没办法直接补充了,而且还有一个不易发觉的问题,就是prompt越长会造成请求性能下降。
RAG,就是使用嵌入或其他搜索技术用与该主题相关的专业知识填充人工智能模型上下文。所以它主要的应用有如下 2 个方向:
- 大模型不擅长回答的垂直领域。例如 OpenAI 的 ChatGPT 是通用大模型,如果你问它一些垂直细分领域的问题时,ChatGPT也回答不好。利用RAG技术,则可以为模型补充足够的领域知识给用户使用,例如医学类的,建筑,法律等。
- 回答封闭领域问题的产品或者应用。例如特定领域或组织的内部知识库。
现在的ChatGPT4已经在实现了RAG功能。比如你在使用ChatGPT时,它可以通过网络搜索获取实时的信息,并将这些信息与用户的问题一起提交给模型来处理。而我们在开发基于大模型的应用时,就需要自定义这个过程。这是因为:只有应用的开发者才会知道权威、正确的数据源。开发者需要保存这些领域知识数据、控制去哪里搜索,以及如何提取知识等。
2.2 工作原理
在正常情况下,LLM会接收用户输入,根据它已经知道的信息构建响应内容。
RAG引入了一个信息检索组件,该组件首先从指定的数据源提取信息,再将用户输入内容连同检索信息内容组成新的提示语(Prompt)提供给LLM,LLM使用这些信息检索内容(新知识)和其原有的训练数据来创建更符合用户期望的响应。它主要包含 3 个部分。
2.2.1 索引(Indexing)
LLM原始训练数据集(语料)之外的数据,统称为外部数据。外部数据可以有多个数据来源,如API、数据库或者文件系统等。所以,数据格式相应的就可以支持如json、xml、数据库记录、文件等。
在LLM应用开发中,通常使用 嵌入(Embedding)的方法,将业务数据(如一个词、短句或文章、图片、视频等)转换为它的数字化表示形式。这个数字化表示形式就是: 向量(Vector)。开发者将该向量存储在向量数据库中(进一步了解向量数据库,请参考 AI探索实践5 - 打造企业智能体(AI Agent)的重要技术-向量数据库),这个存储过程会创建一个生成式AI模型可以理解的知识库。
这个过程叫做 索引 ,将知识库转换为可搜索查询的内容。
下面是一个用OpenAI嵌入的例子:
In [4]: e = client.embeddings.create(input='你好', model="text-embedding-ada-002") // 创建向量
In [5]: len(e.data[0].embedding) // 请求计算数组长度
Out[5]: 1536
In [6]: e.data[0].embedding[:3] // 请求前3个向量
Out[6]: [0.0002545917232055217, -0.0060387649573385715, -0.002320892410352826] // 返回的结果
代码例子中:把一个汉语文本:“你好”,转换了成了一个向量,使用了名为:text-embedding-ada-002的模型。返回的是一个数字数组,有1536个元素。当我们输入查询数组前3个元素时,向量数据库返回了一个包含3个数字的数组。当然,从人类的眼光来看,我们可能无法理解这个数组代表什么。但是,AI模型可以。
2.2.2 检索(Retrieval)
用户输入问题时,会使用检索系统从大型文档集合中查找相关的文档或者段落,这种查找其实是在向量数据库进行语义搜索,也就是在向量空间中查找与之最相似的文本片段。可以这样理解:问题文本被视为空间的一个点,查找的结果可以被视为另外的多个点。在这个空间中,如果两个点越接近,模型会认为它们就越相似。如图:
当用户提问:“Hello, how are you ?” 和 “Hey, how’s it going?”, 这两句话如果以向量方式表示,在大模型看来好像图片上所示的那样,他们距离的非常近,说明相关性很强。而 “I like cupcakes” 距离非常远,说明相关性很弱。这样就会检索出与问题相关的、按相关性排序的一个集合。当然实际上检索排序要比此处示例的更复杂,如果希望深入了解,可以去看看相关的论文。
这样,通过检索可以搜到外部数据源的相关的度最高的文本了,也就实现了针对专业问题的专业回答。
2.2.3 增强LLM提示(Generation)
RAG的真正魔力在于检索和生成两个阶段的结合。一方面,它要确保找到的信息是准确的,另一方面,它还要生成人们容易理解的自然语言。这就像是一个双螺旋结构,两个阶段在不断的交织和进化中生成最终的输出。最关键的是,这一切都在持续的学习和调整中进行,RAG每次生成回答后都会变得更加精准。
三、实现RAG
LangChain框架实现RAG,示例代码:https://github.com/169/ai-snippets
实现RAG主要由以下几个步骤实现:
3.1 加载文档
from langchain_community.document_loaders import UnstructuredMarkdownLoader
loader = UnstructuredMarkdownLoader('fifa/2022.md')
docs = loader.load()
!cat fifa/2022.md
首先加载了一个md文档:fifa/2022.md,然后显示了2022.md文件中的内容。
he 2022 FIFA World Cup was the 22nd FIFA World Cup, the world championship for national football teams organized by FIFA. It took place in Qatar from 20 November to 18 December 2022, after the country was awarded the hosting rights in 2010.
Argentina were crowned the champions after winning the final against the title holder France 4–2 on penalties following a 3–3 draw after extra time.
文件内容主要写的是2022年足球世界杯的冠军的情况。
3.2 拆分文档
有些数据文档内容可能会比较长,因此需要拆分成较小的文档片段,比如几MB大小。
from langchain.text_splitter import RecursiveCharacter
TextSplitter text_splitter = RecursiveCharacterTextSplitter()
documents = text_splitter.split_documents(docs)
3.3 索引文档
把文档内容,存入向量数据库中。
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
embeddings = OpenAIEmbeddings()
vector = FAISS.from_documents(documents, embeddings)
这里使用的是 Facebook
的 Faiss
数据库。Embedding
使用的是 OpenAI
的嵌入方案。建立好索引,可以获得一个代表该文档的向量实例: vector
。
3.4 查询文档
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("""Answer the following question based only on the provided context:
<context>
{context}
</context>
Question: {input}""")
llm = ChatOpenAI()
document_chain = create_stuff_documents_chain(llm, prompt)
此处的查询,是LangChain提供的一个方案。先创建了一个ChatPromptTemplate
模板,模板里有2个参数,context
和 input
。 代表上下文和用户提的问题。大语言模型使用的是OpenAI。也就是说,会将 context
和 input
发送给 OpenAI,由它来回答。
创建一个检索对象:
from langchain.chains import create_retrieval_chain
retriever = vector.as_retriever()
retrieval_chain = create_retrieval_chain(retriever, document_chain)
传入变量input
,设置问题内容:22界世界杯的冠军是哪个国家,并调用 invoke
将获得问题检索的结果,在最后打印这个结果:
response = retrieval_chain.invoke({"input": "Which country won the championship of the 22nd FIFA World Cup?"})
print(response["answer"])
结果是:
Argentina
这个结果,和传入的文档的内容是贴合的,说明在给大模型提供了增强的检索功能后,大模型可以利用RAG做出很好的回答。
如果,我们问了不存在的问题是,比如问它2023年的冠军是哪个国家,并打印模型回答的结果:
response = retrieval_chain.invoke({"input": "Which country won the championship of the 23rd FIFA World Cup?"})
print(response["answer"])
模型回答是:
Based on the provided context, there is no information about the 23rd FIFA World Cup or the country that won the championship.
可以看出,没有给它提供必要的上下文,模型是回答不了的。
总结
代码示例比较简单,但是可以对RAG有一个初步和直观的了解。在LangChain官方网站上也有应用的示例代码,感兴趣的同学可自行观看参考。
RAG模型正在给智能化服务领域带来一场变革。客服机器人、虚拟助手将因RAG的进步而变得更加智能,能够提供更加精准和个性化的服务。随着RAG模型对上下文的理解能力增强,它们将能够更自然地参与到复杂对话中,提供无缝的用户体验。
在知识密集型的行业中,RAG模型将成为一种宝贵的工具,用于管理大量信息和支持决策。它能够帮助专业人士快速获取和整合关键信息,提高工作效率和决策质量。
教育领域也将受益于RAG模型的发展。它可以作为学习辅助工具,为学生提供定制化的学习材料和反馈。RAG能够适应不同学生的学习速度和风格,使教育体验更加个性化和富有成效。
随着研究的深入和技术的成熟,我们有理由期待RAG将在构建更加智能、包容和互联的世界中扮演重要角色。