您的位置:首页 > 房产 > 建筑 > 【AI开发】RAG基础

【AI开发】RAG基础

2024/12/23 9:55:48 来源:https://blog.csdn.net/qq_44899247/article/details/139689370  浏览:    关键词:【AI开发】RAG基础

在这里插入图片描述
RAG的基本流程:

  1. 用一个loader把knowledge base里的知识做成一个个的document,然后把document切分成snippets,把snippets通过embedding(比如openai的embedding模型或者huggingface的)向量化,存储到vectordb向量数据库,以供后续相关性检索。至此便完成了私域数据集的索引indexing。
  2. 第二部分是retrieval检索,主要是先把自己的问题query向量化,然后在vectordb中进行相似度检索,得到相关的snippets。
  3. 最后一部分是把原问题和相关的snippets拼合起来组成prompt,一起送到LLM中,从而得到最想要的答案。

下面用notebook来做一个小demo:

from langchain.chat_models import ChatOpenAI
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessagechat = ChatOpenAI(model='deepseek-chat',openai_api_key="sk-f8f1fab675ea4d2d9e565877d354d464",openai_api_base='https://api.deepseek.com',max_tokens=1024
)
from langchain.schema import(SystemMessage,HumanMessage,AIMessage
)messages = [SystemMessage(content="You are a helpful assistant."),HumanMessage(content="Do you know GPT-4?")
]
res = chat(messages=messages)
print(res.content)

创建一个RAG对话模型

1.加载数据(以GPT-4论文为例)

! pip install pypdf #一个pdf解析器
from langchain.document_loaders import PyPDFLoaderloader = PyPDFLoader("https://arxiv.org/pdf/2303.08774")pages = loader.load_and_split()
pages[0]

2.知识切片 将文档分割成均匀的块,每个块是一段原始文本

from langchain.text_splitter import RecursiveCharacterTextSplittertext_spliter = RecursiveCharacterTextSplitter(chunk_size = 500,     #最大500为一段chunk_overlap = 50     #最多重叠50
)
docs = text_spliter.split_documents(pages)
len(docs)

3.用embedding模型把切片向量化,存储到向量数据库中,方便下次问问题的时候进行相关性检索

from langchain.embeddings.openai import OpenAIEmbeddings #embedding模型用的openai的达芬奇模型,收费且deepseek没有开发,所以不用
#! pip install sentence-transformers #我们用免费的sentence-transformers
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma  #向量库chromamodel_name = '.cache/huggingface/hub/models--sentence-transformers--sentence-t5-large/snapshots/7f77100e0c564a5c2faeebd3cac0e5c1771b257e'
embedding = HuggingFaceEmbeddings(model_name=model_name)
vectorstore_hf = Chroma.from_documents(documents=docs,   embedding=embedding,collection_name="test_LangchainRAG_hf_embed")

4.通过向量相似度检索和问题最相关的k个文档

query = "How large is GPT-4 vocabulary"
result = vectorstore_hf.similarity_search(query=query, k=2)

5.原始query和检索得到的文本组合起来输入语言模型,得到最终的输出

def augment_prompt(query: str):#获取top3的文本片段result3 = vectorstore_hf.similarity_search(query=query,k=3)source_knowledge = "\n".join([x.page_content for x in result3])#构建prompt#这里是一个f-string的用法,允许在字符串中嵌入表达式,运行的时候表达式会被其value代替augment_prompt = f"""Using the contexts below, answer the query.   contexts:{source_knowledge}query: {query}"""return augment_prompt
print(augment_prompt(query))
#创建prompt
prompt = HumanMessage(content=augment_prompt(query=query)
)messages.append(prompt)
res_afteraug = chat(messages=messages)
print(res.content)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com