微信扫码
与创始人交个朋友
我要投稿
01
02
03
04
任务特定 vs 通用性:微调通常是为特定任务进行优化,而RAG是通用的,可以用于多种任务。微调对于特定任务的完成效果好,但在通用性问题上不够灵活。
知识引用 vs 学习:RAG 模型通过引用知识库来生成答案,而微调是通过学习任务特定的数据生成答案。RAG 的答案直接来自外部知识,更容易核实。
即时性 vs 训练:RAG 模型可以实现即时的知识更新,无需重新训练,在及时性要求高的应用中占优势。微调通常需要重新训练模型,时间成本较高。
可解释性 vs 难以解释性:RAG 的答案可解释性强,因为它们来自知识库。微调模型的内部学习可能难以解释。
定制 vs 通用性:RAG 可以根据特定领域进行定制,而微调需要为每个任务进行特定微调,需要更多任务特定的数据。
结合上面的比较,我们可以清楚的看到 RAG 的优势在于通用性、知识引用、即时性和可解释性,而微调在特定任务上可能更适用,但同时需要更多的任务特定数据和训练。选择使用哪种方法,应根据具体的应用需求和任务来决定。
05
!pip install --upgrade erniebot 测试embedding import ernieboterniebot.api_type = "aistudio"erniebot.access_token = "<你的token>"response = erniebot.Embedding.create(model="ernie-text-embedding",input=["我是百度公司开发的人工智能语言模型,我的中文名是文心一言,英文名是ERNIE-Bot,可以协助您完成范围广泛的任务并提供有关各种主题的信息,比如回答问题,提供定义和解释及建议。如果您有任何问题,请随时向我提问。" ])print(response.get_result())
!pip install chromadb
▎自定义嵌入函数
import os
import erniebot
from typing import Dict, List, Optional
import chromadb
from chromadb.api.types import Documents, EmbeddingFunction, Embeddings
def embed_query(content):
response = erniebot.embedding.create(
model="ernie-text-embedding",
input=[content])
result = response.get_result()
print(result)
return result
class ErnieEmbeddingFunction(EmbeddingFunction):
def __call__(self, input: Documents) -> Embeddings:
embeddings = []
for text in input:
response = embed_query(text)
try:
embedding = response[0]
embeddings.append(embedding)
except (IndexError, TypeError, KeyError) as e:
print(f"Error processing text: {text}, Error: {e}")
return embeddings
chroma_client = chromadb.Client()
chroma_client = chromadb.PersistentClient(path="chromac") #数据保存硬盘位置 可选
collection = chroma_client.create_collection(name="demo", embedding_function=ErnieEmbeddingFunction())
print(collection)
▎导入数据集
▎文档切割
from langchain.text_splitter import CharacterTextSplitterfrom langchain.vectorstores import Chromafrom langchain.document_loaders import TextLoader loader = TextLoader('./AI大课逐字稿.txt',encoding='utf-8')documents = loader.load()text_splitter = CharacterTextSplitter(chunk_size=600, chunk_overlap=20)docs = text_splitter.split_documents(documents)docs
▎Embedding 嵌入
将分割后的文档列表转换为嵌入向量,以便进行进一步的分析和处理。
import uuiddocs_list=[]metadatas=[]ids=[]for item in docs:docs_list.append(item.page_content)metadatas.append({"source": "AI大课逐字稿"})ids.append(str(uuid.uuid4())) collection.add(documents=docs_list,metadatas=metadatas,ids=ids)
▎检索
query = "讲师说见VC有两种错误的思维方式,分别是什么"
results = collection.query(
query_texts=[query],
n_results=2
)
content=results['documents'][0]
[ ]
prompt=f"""
用户问题:{query}
<context>
{content}
</context>
根据<context>里的知识点回答用户问题
"""
response = erniebot.ChatCompletion.create(model="ernie-4.0", messages=[{"role": "user", "content": prompt}])
print(response.get_result())
#讲师说见VC有两种错误的思维方式,分别是:
##1. 用过去的方式套今天的人工智能,比如比喻成OS。一旦比喻成操作系统,就得出结论全世界两套到三套,你觉得必然会被垄断、没有机会了,这种是典型的刻舟求剑。
#2. 人容易对已经成功的事委曲求全,对于创新的新生代创业者容易求全责备。特别是有些做VC容易犯这个错误,比如OpenAI做成了,已经证明了,是个傻子都能看到OpenAI做的很成功,我们容易对它顶礼膜拜,恨不得跪下。对创业者很多还不成形的想法,因为八字没有一撇,光看到了你的很多缺点,这种价值观是不对的,容易Miss掉一些有潜力的项目。
▎封装函数
def main(query):results = collection.query(query_texts=[query],n_results=2)content=results['documents'][0]prompt=f"""用户问题:{query}<context>{content}</context>根据<context>里的知识点回答用户问题"""response = erniebot.ChatCompletion.create(model="ernie-4.0", messages=[{"role": "user", "content": prompt}])return response.get_result()query=input("请输入您要查询的问题:")print(main(query))
代码地址:
https://aistudio.baidu.com/projectdetail/7431640
显然,RAG 的应用不仅仅满足于此,目前也诞生了各种 RAG 的高阶用法。
通过不断优化 RAG,使其具有更强大的信息理解能力,理解问题更加透彻,找到与问题高度匹配的信息后,生成更为精准的答案。比如针对“讲一下金毛犬的特点”这一指令,高级 RAG 模型可以理解这是一个关于小狗特定品种的问题,将从知识库中提取金毛犬的细节信息,如体格、性格、历史等,以对齐问题的颗粒度,提供详细的回答。
在优化 RAG 的过程中,也产生了一系列相关的方法。
在信息检索和搜索引擎优化领域,通过实施一系列策略可以显著提升检索系统的性能。索引优化通过提升数据粒度、优化索引结构、添加元数据信息、对齐优化和混合检索等方法,可以提高检索的准确性和效率。向量表征模型的优化通过微调和动态嵌入技术,增强了模型对特定领域或问题的理解能力。检索后处理策略如重排序和 Prompt 压缩,进一步提升了检索结果的相关性和用户满意度。递归检索和搜索引擎优化通过递归检索和子查询等技术,实现了更复杂和精确的检索需求。最后,RAG 评估通过独立评估和端到端评估方法,确保了检索系统在各个方面都能满足用户的需求。这些策略的实施,共同推动了检索技术的进步,为用户提供了更加高效和精准的信息服务。
具体参考下图:
除了以上5种方法,还有其他很多高级的 RAG 用法,大家可以针对感兴趣的部分自行查阅相关论文,进行学习了解。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-03-30
2024-04-26
2024-05-10
2024-04-12
2024-05-28
2024-05-14
2024-04-25
2024-07-18
2024-04-26
2024-08-13
2024-12-22
2024-12-21
2024-12-21
2024-12-21
2024-12-21
2024-12-20
2024-12-20
2024-12-19