什么是 rag?
rag 代表检索增强生成,这是一种强大的技术,旨在通过以文档形式为大型语言模型(llm)提供特定的相关上下文来增强其性能。与纯粹根据预先训练的知识生成响应的传统法学硕士不同,rag 允许您通过检索和利用实时数据或特定领域的信息,使模型的输出与您期望的结果更紧密地结合起来。
rag 与微调
虽然 rag 和微调的目的都是提高 llm 的性能,但 rag 通常是一种更高效且资源友好的方法。微调涉及在专门的数据集上重新训练模型,这需要大量的计算资源、时间和专业知识。另一方面,rag 动态检索相关信息并将其合并到生成过程中,从而可以更灵活且更具成本效益地适应新任务,而无需进行大量的再培训。
构建 rag 代理
安装要求
安装奥拉马
ollama 提供本地运行 llama 所需的后端基础设施。首先,请访问 ollama 的网站并下载该应用程序。按照说明在本地计算机上进行设置。
安装 langchain 要求
langchain 是一个 Python 框架,旨在与各种 llm 和向量数据库配合使用,使其成为构建 rag 代理的理想选择。通过运行以下命令安装 langchain 及其依赖项:
对 rag 代理进行编码
首先,您需要一个函数来与本地 llama 实例交互。设置方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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类中:
1
2
3
4
5
6
7
8
9
|
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 的预训练嵌入进行设置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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 代理将用于根据检索到的文档生成响应的提示模板:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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 生成结合成一个内聚链:
1
2
3
4
5
6
7
8
9
10
|
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 服务器已启动并正在运行。使用以下命令启动服务器:
提示您的 rag 代理
现在,您可以通过发送查询来测试您的 rag 代理:
1
2
3
4
5
6
7
8
9
|
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 的性能。此设置可以适应各种领域和任务,使其成为上下文感知生成至关重要的任何应用程序的通用解决方案。