如何使用 Ollama 和 LangChain 创建本地 RAG 代理
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
什么是 RAG?
RAG 代表检索增强生成(Retrieval-Augmented Generation),它是一种强大的技术,旨在通过提供特定且相关的文档上下文来提升大型语言模型(LLM)的性能。与完全基于预训练知识生成响应的传统 LLM 不同,RAG 允许您通过检索和利用实时数据或特定领域的信息,使模型的输出更贴近您期望的结果。
RAG 与微调
尽管 RAG 和微调都旨在提升 LLM 的性能,但 RAG 通常是一种更高效、更节省资源的方法。微调需要在专门的数据集上重新训练模型,这需要大量的计算资源、时间和专业知识。而 RAG 则动态地检索相关信息并将其融入到生成过程中,从而无需进行大量的重新训练,即可更灵活、更经济高效地适应新任务。
构建 RAG 代理
安装所需组件
安装 Ollama
Ollama 提供在本地运行 LLaMA 所需的后端基础设施。要开始使用,请访问Ollama 网站并下载应用程序。按照说明将其安装到您的本地计算机上。
安装 LangChain 要求
LangChain 是一个 Python 框架,旨在与各种 LLM 和向量数据库配合使用,因此非常适合构建 RAG 代理。运行以下命令安装 LangChain 及其依赖项:
pip install langchain
RAG Agent 的编码
创建 API 函数
首先,您需要一个与本地 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
接下来,将此功能集成到 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"
集成 RAG 代理
设置寻回犬
检索器负责根据用户的查询获取相关文档。以下是如何使用 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)
启动您的 Ollama 服务器
运行 RAG 代理之前,请确保 Ollama 服务器已启动并运行。使用以下命令启动服务器:
ollama serve
提醒您的 RAG 代理
现在,您可以通过发送查询来测试您的 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 的性能。此设置可适用于各种领域和任务,使其成为任何需要上下文感知生成功能的应用的通用解决方案。
文章来源:https://dev.to/dmuraco3/how-to-create-a-local-rag-agent-with-ollama-and-langchain-1m9a