小白1小时搞定2000字专业文章
生财有术 ·
小白1小时搞定2000字专业文章
来自:
生财有术
最近在学习明白老师的基础写作课,同时,朋友想学习向量数据库Milvus,我就想,能不能两者结合一下一是巩固,二是也是帮朋友一下,这篇文章,演示如何用Milvus,实现RAG。什么是RAGRAG系统结合了检索系统和生成模型,基于给定的提示生成新的文本。该系统首先使用Milvus从语料库中检索相关文档,然后使用生成模型基于检索到的文档生成新的文本。具体来说:1.RAG系统包含两个主要部分:检索系统和生成模型。2.检索系统使用Milvus向量数据库来存储和检索文档。Milvus可以高效地进行相似性搜索,从大规模语料库中快速找到与查询相关的文档。3.当系统收到一个提示或查询时,它首先使用Milvus检索最相关的文档。这个过程利用了Milvus的向量相似度搜索能力。4.检索到相关文档后,系统将这些文档连同原始提示一起传递给生成模型。5.生成模型(通常是一个大型语言模型)会基于检索到的文档内容和原始提示生成新的文本。这确保了生成的内容既相关又信息丰富。6.通过这种方式,RAG系统可以生成基于最新和最相关信息的回答,而不仅仅依赖于预训练的知识。这种方法充分利用了Milvus在高维向量检索方面的优势,使RAG系统能够从大规模数据集中快速准确地检索相关信息,从而提高生成内容的质量和相关性。Milvus如何实现RAG第1步,安装pymilvus包
第2步,配置Openai的APIkey
importos
os.environ["OPENAIAPIKEY"]="sk-*"
第3步:导入明白老师的38节写作基础课,文字稿
importjson
importurllib.request
file_path="Mingbaiwriting.txt"ifnotos.path.exists(file_path): urllib.request.urlretrieve(url,file_path)
第5步:定义了一个名为emb_text的函数,用于生成文本嵌入。这个函数的作用是将输入的文本转换为数值向量(嵌入),这个向量捕捉了文本的语义信息。这种嵌入可以用于各种自然语言处理任务,如语义搜索、文本分类或聚类分析等。使用"text-embedding-3-small"模型可以在效率和性能之间取得良好的平衡。
defemb_text(text):
return
(openaiclient.embeddings.create(input=text,model="text-embedding-3-small").data[0].embedding
第6步:创建Collection,如果已经存在,就丢弃。如果我们不指定任何字段信息,Milvus会自动创建以下内容:一个默认的id字段作为主键一个向量字段用于存储向量数据一个保留的JSON字段,用于存储未在schema中定义的字段及其值这种自动创建的默认结构为用户提供了便利,无需手动定义每个字段就可以快速开始使用Milvus。同时,保留的JSON字段也提供了灵活性,允许存储一些额外的、未在schema中预先定义的数据。这对于处理动态或不确定的数据结构非常有用。
frompymilvusimportMilvusClient
milvusclient=MilvusClient(uri="./milvusdemo.db")collectionname="myragcollection"ifmilvusclient.hascollection(collectionname):
milvusclient.createcollection( collectionname=collectionname, dimension=embeddingdim, metrictype="IP", #Innerproductdistance consistencylevel="Strong", #Strongconsistencylevel)
第7步:遍历文本行,创建嵌入向量,然后将数据插入到Milvus中。这里有一个新字段text,它在集合模式中是未定义的字段。它将被自动添加到保留的JSON动态字段中,在高层次上可以被视为一个普通字段。这段话解释了以下几点:处理数据的过程:遍历文本,为每行创建嵌入向量,然后将数据插入Milvus。引入了一个新字段"text",这个字段在原始的集合模式(schema)中并未定义。尽管"text"字段未在模式中定义,但由于启用了动态字段功能,它会被自动添加到一个保留的JSON动态字段中。虽然"text"是动态添加的字段,但在使用时可以像普通预定义字段一样对待它。这体现了Milvus的动态模式特性,允许在不修改原始模式的情况下灵活地添加新字段,提高了数据插入和管理的灵活性。
fromtqdmimporttqdm
databeginarrayrlmathbfSigma&=left[beginarraylllllllendarrayright]endarray
fori,lineinenumerate(tqdm(text_lines,desc="Creatingembeddings")): data.append("id":i,"vector":emb_text(line),"text":line)milvusclient.insert(collectionname=collectionname,data=data)
第8步:在集合中搜索问题并检索语义上最相似的前3个匹配结果。这段代码的具体含义是:使用milvusclient.search方法在指定的集合中进行搜索。搜索的数据是将输入的问题(question)通过emb_text函数转换成的嵌入向量。limimathbfchi_=3表示返回相似度最高的前3个结果。搜索参数使用内积(InnerProduct,IP)作为相似度度量方法。outputfields=["text"]指定返回结果中包含"text"字段。这种搜索方法利用了向量相似度来找到语义上最接近的匹配,而不是简单的关键词匹配,因此能够检索到语义上相关的结果。
question="为什么要写作"search_res=milvusclient.search(collectionname=collectionname,
data=[emb_text(question)],#Usetheemb_text
functiontoconvertthequestiontoanembeddingvectorlimit=3,#Returntop3resultssearchparams="metrictype":"IP","params":,#Innerproductdistanceoutputfields=["text"],#Returnthetextfield)retrievedlineswithdistancesmathbfSigma=beginarrayrlendarrayleftbeginarraylllendarrayright. (res["entity",res["distance"])forresinsearch_res[0]]print(json.dumps(retrievedlineswithdistances,indent=4))
第9步:这个用户提示为语言模型提供了具体的指令:它指示模型使用标签中的信息来回答问题。context是一个占位符,将被从Milvus检索到的相关文档填充。question是一个占位符,将被用户的具体问题替换。这种提示结构的设计目的是:为语言模型定义系统级行为(作为能回答问题的AI助手)。提供一个结构化的格式,将检索到的上下文信息和用户问题传递给模型。指导模型使用提供的上下文来回答特定问题,而不是依赖其预训练知识。这种方法结合了检索增强生成(RAG)技术,通过从Milvus检索相关文档来增强语言模型的回答能力。
context="n".join( [linewithdistance[0]forlinewithdistanceinretrievedlineswithdistances]
SYSTEMPROMPT="""
Human:YouareanAIassistant.Youareabletofindanswerstothequestionsfromthecontextualpassages
USERPROMPT=f"""
Usethefollowingpiecesofinformationenclosedin
losedin
context
question
"""
response=openaiclient.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
"role":"system","content":SYSTEMPROMPT,
"role":"user","content":USERPROMPT,
],
)
检索到的context是:
我想了解,是什么让明白老师坚定日更1000天,我输入的问题是"为什么写作"。我得到的答案是:写作对于普通人来说,是一个重要的基础技能。通过写作,可以提高赚钱效率和概率,促进个人成长和提升。通过深入思考写作的意义和
价值,可以帮助人们更有方向、更有效率地写作,并从中获得更大的收益。写作不仅仅是一种技能,更是一个系统,需要输入、思考、输出等多个因素相结合。通过持续写作,一个人的能力和价值也会不断提高,最终实现个人成长和收益的目标。
完整代码联系索取。
总结
我大概用了1.5半小时是实现这个代码,中间遇到了安装包冲突等问题,明白老师的38节课程,完全手工复制,加工,大概用了20分钟,也就是1个小时,就能实现个人知识库。Milvus使用起来,还是非常方便。
收集素材是写作的基础,火爆标题,金句,在日常生活中收集,然后建立自己的知识库,快速查询,还是很方便的。