发布于 2026-01-06 9 阅读
0

如何使用 Ollama 和 LangChain 创建本地 RAG 代理 DEV 的全球展示与讲述挑战赛(由 Mux 呈现):推介你的项目!

如何使用 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
Enter fullscreen mode Exit fullscreen mode

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"]
Enter fullscreen mode Exit fullscreen mode

创建 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"
Enter fullscreen mode Exit fullscreen mode

集成 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)
Enter fullscreen mode Exit fullscreen mode

创建提示模板

定义 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")
])
Enter fullscreen mode Exit fullscreen mode

创建文档和检索器链

将文档检索和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)
Enter fullscreen mode Exit fullscreen mode

启动您的 Ollama 服务器

运行 RAG 代理之前,请确保 Ollama 服务器已启动并运行。使用以下命令启动服务器:

ollama serve
Enter fullscreen mode Exit fullscreen mode

提醒您的 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)
Enter fullscreen mode Exit fullscreen mode

回复:
“很抱歉您收到了损坏的商品。根据我们的政策,如果您收到损坏的商品,请立即联系我们的客服团队并提供损坏照片。我们将为您安排更换或退款。您需要我协助您办理退款吗?我需要您提供一些信息,例如您的订单号和损坏商品的详细信息。请您提供这些信息,以便我处理您的请求。”


按照这些步骤,您可以创建一个功能齐全的本地 RAG 代理,它能够利用实时上下文信息增强 LLM 的性能。此设置可适用于各种领域和任务,使其成为任何需要上下文感知生成功能的应用的通用解决方案。

文章来源:https://dev.to/dmuraco3/how-to-create-a-local-rag-agent-with-ollama-and-langchain-1m9a