PHP前端开发

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

百变鹏仔 3天前 #Python
文章标签 如何使用

什么是 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 rpostdef 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 llmclass 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 faissfrom langchain_huggingface import huggingfaceembeddingsdocuments = [    {"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, messagesplaceholderfaq_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_chaindocument_chain = create_stuff_documents_chain(llama(), faq_prompt)def parse_retriever_input(params):    return params["messages"][-1].contentretrieval_chain = runnablepassthrough.assign(    context=parse_retriever_input | retriever).assign(answer=document_chain)

启动您的 ollama 服务器

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

ollama serve

提示您的 rag 代理

现在,您可以通过发送查询来测试您的 rag 代理:

from langchain.schema import HumanMessageresponse = retrieval_chain.invoke({    "messages": [        HumanMessage("I received a damaged item. I want my money back.")    ]})print(response)

回复:
“得知您收到损坏的物品,我感到非常遗憾。根据我们的政策,如果您收到损坏的物品,请立即联系我们的客户服务团队并附上损坏的照片。我们将为您安排更换或退款。您希望我帮助您获得退款吗?我需要您提供一些信息,例如您的订单号和有关损坏物品的详细信息,以便我帮助处理您的请求吗?”


通过执行以下步骤,您可以创建一个功能齐全的本地 rag 代理,能够通过实时上下文增强 llm 的性能。此设置可以适应各种领域和任务,使其成为上下文感知生成至关重要的任何应用程序的通用解决方案。