跳到正文
技术吧
返回

如何使用 Llama 3 构建本地 RAG 应用程序

更新于:

通过利用 Llama 3 和 RAG 技术的功能,我们将创建一个应用程序,让用户能够与网页进行交互式对话,检索相关信息并生成对用户查询的准确响应。在本教程中,我们将逐步介绍设置开发环境、加载和处理网页数据、创建嵌入和向量存储以及实现 RAG 链以提供卓越用户体验的过程。

什么是 Llama 3?

Llama 3 是 Meta AI 开发的最先进的语言模型,擅长理解和生成类似人类的文本。

什么是 RAG?

检索增强生成 (RAG) 是一种结合信息检索和语言生成的技术,以增强问答系统的性能。

有了以上所有信息,让我们开始吧!

运行本地 Llama 3 RAG 应用程序的先决条件

在开始之前,请确保您已安装以下先决条件:

您可以通过运行以下命令来安装所需的库:

 pip install streamlit ollama langchain langchain_community

使用 Llama-3 在本地运行自己的 RAG 应用程序

步骤 1:设置 Streamlit 应用程序

首先,让我们设置 Streamlit 应用程序的基本结构。创建一个名为 的新 Python 文件app.py并添加以下代码:

 import streamlit as st  
 import ollama  
 from langchain.text_splitter import RecursiveCharacterTextSplitter  
 from langchain_community.document_loaders import WebBaseLoader  
 from langchain_community.vectorstores import Chroma  
 from langchain_community.embeddings import OllamaEmbeddings  
 ​  
 st.title("Chat with Webpage 🌐")  
 st.caption("This app allows you to chat with a webpage using local Llama-3 and RAG")  
 # Get the webpage URL from the user  
 webpage_url = st.text_input("Enter Webpage URL", type="default")

此代码设置了 Streamlit 应用程序的基本结构,包括标题、标题和供用户输入网页 URL 的输入字段。

第 2 步:加载并处理网页数据

接下来,我们需要从指定的网页加载数据并进行处理以供进一步使用。将以下代码添加到app.py

 if webpage_url:  
     # 1. Load the data  
     loader = WebBaseLoader(webpage_url)  
     docs = loader.load()  
     text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=10)  
     splits = text_splitter.split_documents(docs)

这里,我们使用WebBaseLoader来加载网页数据。然后,我们使用RecursiveCharacterTextSplitter将加载的文档拆分成更小的块。

步骤 3:创建 Ollama 嵌入和向量存储

为了能够高效地从网页中检索相关信息,我们需要创建嵌入和向量存储。添加以下代码:

 # 2. Create Ollama embeddings and vector store  
 embeddings = OllamaEmbeddings(model="llama3")  
 vectorstore = Chroma.from_documents(documents=splits, embedding=embeddings)

我们使用OllamaEmbeddings类来创建 Ollama 嵌入并指定llama3模型。然后,我们使用该类创建一个向量存储Chroma,并传递拆分文档和嵌入。

步骤 4:定义 Ollama Llama-3 模型函数

现在,让我们定义一个函数,利用 Ollama Llama-3 模型根据用户的问题和相关上下文生成响应。添加以下代码:

 # 3. Call Ollama Llama3 model  
 def ollama_llm(question, context):  
     formatted_prompt = f"Question: {question}\n\nContext: {context}"  
     response = ollama.chat(model='llama3', messages=[{'role': 'user', 'content': formatted_prompt}])  
     return response['message']['content']

此函数将用户的问题和相关上下文作为输入。它通过结合问题和上下文来格式化提示,然后使用该ollama.chat函数使用 Llama-3 模型生成响应。

步骤5:设置RAG链

为了根据用户的问题从向量存储中检索相关信息,我们需要设置 RAG(检索增强生成)链。添加以下代码:

 # 4. RAG Setup  
 retriever = vectorstore.as_retriever()  
 ​  
 def combine_docs(docs):  
     return "\n\n".join(doc.page_content for doc in docs)  
 ​  
 def rag_chain(question):  
     retrieved_docs = retriever.invoke(question)  
     formatted_context = combine_docs(retrieved_docs)  
     return ollama_llm(question, formatted_context)  
 ​  
 st.success(f"Loaded {webpage_url} successfully!")

在这里,我们使用该方法从向量存储中创建一个检索器as_retriever。我们定义一个辅助函数,combine_docs将检索到的文档组合成一个格式化的上下文字符串。该rag_chain函数接收用户的问题,使用检索器检索相关文档,将文档组合成格式化的上下文,并将问题和上下文传递给该ollama_llm函数以生成响应。

步骤6:实现聊天功能

最后,让我们在 Streamlit 应用中实现聊天功能。添加以下代码:

 # Ask a question about the webpage  
 prompt = st.text_input("Ask any question about the webpage")  
 ​  
 # Chat with the webpage  
 if prompt:  
     result = rag_chain(prompt)  
     st.write(result)

此代码添加了一个输入字段,供用户询问有关网页的问题。当用户输入问题并提交时,rag_chain将使用用户的问题调用该函数。然后使用 显示生成的响应st.write

最后一步:运行应用程序的时候到了!

要运行该应用程序,请保存app.py文件并在同一目录中打开终端。运行以下命令:

 streamlit run app.py

这将启动 Streamlit 应用程序,您可以通过提供的 URL 在 Web 浏览器中访问它。

结论

恭喜!您已成功构建了一个在本地运行的 Llama-3 RAG 应用。该应用利用本地 Llama-3 和 RAG 技术的强大功能,让用户能够与网页聊天。用户可以输入网页 URL,应用将加载和处理网页数据、创建嵌入和向量存储,并使用 RAG 链检索相关信息并根据用户的问题生成回复。

您可以根据需要通过添加更多功能、改进用户界面或集成其他功能来进一步探索和增强应用程序。


分享本文:

上一篇
使用 ChatGPT 进行命名实体识别 (NER)
下一篇
如何使用 Ollama和本地LLM构建聊天机器人