首页 > 后端开发 > Python教程 > 如何使用 Ollama 和 LangChain 创建本地 RAG 代理

如何使用 Ollama 和 LangChain 创建本地 RAG 代理

王林
发布: 2024-08-14 10:31:13
原创
982 人浏览过

How to Create a Local RAG Agent with Ollama and LangChain

什么是 RAG?

RAG 代表 检索增强生成,这是一种强大的技术,旨在通过以文档形式为大型语言模型 (LLM) 提供特定的相关上下文来增强其性能。与纯粹根据预先训练的知识生成响应的传统法学硕士不同,RAG 允许您通过检索和利用实时数据或特定领域的信息,使模型的输出与您期望的结果更紧密地结合起来。

RAG 与微调

虽然 RAG 和微调的目的都是提高 LLM 的性能,但 RAG 通常是一种更高效且资源友好的方法。微调涉及在专门的数据集上重新训练模型,这需要大量的计算资源、时间和专业知识。另一方面,RAG 动态检索相关信息并将其合并到生成过程中,从而可以更灵活且更具成本效益地适应新任务,而无需进行大量的再训练。

构建 RAG 代理

安装要求

安装奥拉马

Ollama 提供本地运行 LLaMA 所需的后端基础设施。首先,请访问 Ollama 的网站并下载该应用程序。按照说明在本地计算机上进行设置。

安装 LangChain 要求

LangChain 是一个 Python 框架,旨在与各种 LLM 和向量数据库配合使用,使其成为构建 RAG 代理的理想选择。通过运行以下命令安装 LangChain 及其依赖项:

pip install langchain
登录后复制

对 RAG 代理进行编码

创建 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 的性能。此设置可以适应各种领域和任务,使其成为上下文感知生成至关重要的任何应用程序的通用解决方案。

以上是如何使用 Ollama 和 LangChain 创建本地 RAG 代理的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板