RAG 代表 检索增强生成,这是一种强大的技术,旨在通过以文档形式为大型语言模型 (LLM) 提供特定的相关上下文来增强其性能。与纯粹根据预先训练的知识生成响应的传统法学硕士不同,RAG 允许您通过检索和利用实时数据或特定领域的信息,使模型的输出与您期望的结果更紧密地结合起来。
虽然 RAG 和微调的目的都是提高 LLM 的性能,但 RAG 通常是一种更高效且资源友好的方法。微调涉及在专门的数据集上重新训练模型,这需要大量的计算资源、时间和专业知识。另一方面,RAG 动态检索相关信息并将其合并到生成过程中,从而可以更灵活且更具成本效益地适应新任务,而无需进行大量的再训练。
Ollama 提供本地运行 LLaMA 所需的后端基础设施。首先,请访问 Ollama 的网站并下载该应用程序。按照说明在本地计算机上进行设置。
LangChain 是一个 Python 框架,旨在与各种 LLM 和向量数据库配合使用,使其成为构建 RAG 代理的理想选择。通过运行以下命令安装 LangChain 及其依赖项:
pip install langchain
首先,您需要一个函数来与本地 LLaMA 实例交互。设置方法如下:
from requests import post as rpost def call_llama(prompt): headers = {"Content-Type": "application/json"} payload = { "model": "llama3.1", "prompt": prompt, "stream": False, } response = rpost( "http://localhost:11434/api/generate", headers=headers, json=payload ) return response.json()["response"]
接下来,将此函数集成到LangChain内的自定义LLM类中:
from langchain_core.language_models.llms import LLM class LLaMa(LLM): def _call(self, prompt, **kwargs): return call_llama(prompt) @property def _llm_type(self): return "llama-3.1-8b"
检索器负责根据用户的查询获取相关文档。以下是如何使用 FAISS 进行矢量存储和 HuggingFace 的预训练嵌入进行设置:
from langchain.vectorstores import FAISS from langchain_huggingface import HuggingFaceEmbeddings documents = [ {"content": "What is your return policy? ..."}, {"content": "How long does shipping take? ..."}, # Add more documents as needed ] texts = [doc["content"] for doc in documents] retriever = FAISS.from_texts( texts, HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2") ).as_retriever(k=5)
定义 RAG 代理将用于根据检索到的文档生成响应的提示模板:
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder faq_template = """ You are a chat agent for my E-Commerce Company. As a chat agent, it is your duty to help the human with their inquiry and make them a happy customer. Help them, using the following context: <context> {context} </context> """ faq_prompt = ChatPromptTemplate.from_messages([ ("system", faq_template), MessagesPlaceholder("messages") ])
将文档检索和 LLaMA 生成结合成一个内聚链:
from langchain.chains.combine_documents import create_stuff_documents_chain document_chain = create_stuff_documents_chain(LLaMa(), faq_prompt) def parse_retriever_input(params): return params["messages"][-1].content retrieval_chain = RunnablePassthrough.assign( context=parse_retriever_input | retriever ).assign(answer=document_chain)
在运行 RAG 代理之前,请确保 Ollama 服务器已启动并正在运行。使用以下命令启动服务器:
ollama serve
现在,您可以通过发送查询来测试您的 RAG 代理:
from langchain.schema import HumanMessage response = retrieval_chain.invoke({ "messages": [ HumanMessage("I received a damaged item. I want my money back.") ] }) print(response)
回复:
“得知您收到损坏的物品,我感到非常遗憾。根据我们的政策,如果您收到损坏的物品,请立即联系我们的客户服务团队并附上损坏的照片。我们将为您安排更换或退款。您希望我帮助您获得退款吗?我需要您提供一些信息,例如您的订单号和有关损坏物品的详细信息,以便我帮助处理您的请求?”
通过遵循这些步骤,您可以创建一个功能齐全的本地 RAG 代理,能够通过实时上下文增强 LLM 的性能。此设置可以适应各种领域和任务,使其成为上下文感知生成至关重要的任何应用程序的通用解决方案。
以上是如何使用 Ollama 和 LangChain 创建本地 RAG 代理的详细内容。更多信息请关注PHP中文网其他相关文章!