1.RAG技术主要解决了什么问题
-
解决通用LLM针对一些小众领域没有涉猎的问题(私域)
-
提升LLM回答的准确性、权威性、时效性
-
提高LLM回答的可控性和可解释性,提高模型的可信度和安全性
2.RAG流程
- 1文档加载- 2文档分割- 3文档向量化-4构建向量库- 5基于知识库的问答
文档加载用TextLoader
文档分割用CharacterTextSplitter(字符串分割)
文档向量化用DashScopeEmbeddings(阿里云百炼大模型服务平台的文本嵌入服务)
构建向量库用Chroma
3.代码示例
from langchain_community.vectorstores import Chroma
from langchain.embeddings.dashscope import DashScopeEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.document_loaders import TextLoader
from langchain.prompts import PromptTemplate
# 实例化TextLoader对象,用于加载文本文件
loader = TextLoader("./doc/NBA新闻.txt", encoding="utf-8")
# 加载文档,将文本文件内容转化为文档对象
docs = loader.load()
print(docs)
# 实例化CharacterTextSplitter对象,用于将文档分割为更小的文本块
text_splitter = CharacterTextSplitter(separator="\n", chunk_size=150, chunk_overlap=0)
# 使用文本分割器分割文档
texts = text_splitter.split_documents(docs)
# 实例化DashScopeEmbeddings对象,用于将文本嵌入到向量空间
embeddings = DashScopeEmbeddings()
# 创建向量数据库,向量化文档,并指定持久化目录
db = Chroma.from_documents(texts, embeddings, persist_directory="./chroma")
# 将数据库数据持久化
db.persist()
# 执行相似检索,查找与查询最相关的文档片段
content = db.similarity_search("2023年NBA冠军是谁", k=1)
# 定义PromptTemplate对象,用于构建提示模板
template = "请参照下面的内容回答问题:\n{context}\n问题:{question}"
promptTemplate = PromptTemplate(input_variables=["question", "context"], template=template)
# 根据模板和具体问题以及检索到的内容生成提示
prompt = promptTemplate.format(question="2023年NBA冠军是谁", context=content[0].page_content)
print(prompt)
4.自己写的API
(1)先写方法
# 引入向量化的类
import os
# 导入Chroma向量存储库,用于高效地存储和检索向量
from langchain_community.vectorstores import Chroma
# 导入DashScopeEmbeddings,用于文本嵌入,将文本转换为向量
from langchain.embeddings.dashscope import DashScopeEmbeddings
# 导入CharacterTextSplitter,用于将文本分割成更小的块,以便处理
from langchain.text_splitter import CharacterTextSplitter
# 导入TextLoader,用于加载文本文件为文档对象
from langchain_community.document_loaders import TextLoader
# 导入Django设置模块,以便在项目中使用设置值
from django.conf import settings
# 导入PromptTemplate,用于创建和管理提示模板
from langchain.prompts import PromptTemplate
from .test02 import get_response
def get_RAG(x):
# 根据输入的文件名x构造文件路径
file_path = os.path.join(settings.BASE_DIR, 'media', x)
# 使用TextLoader加载文档,指定文档路径和编码格式
loader = TextLoader(file_path, encoding='utf-8')
# 加载文档内容
docs = loader.load()
# 打印加载的文档内容
print(docs)
# 导入分割类
# 初始化一个字符文本分割器,用于将长文本分割成更小的块
# 设置每个块的最大长度为200个字符,块之间的重叠长度为50个字符
text_splitter = CharacterTextSplitter(chunk_size=200, chunk_overlap=50)
# 使用分割类分割文档
texts = text_splitter.split_documents(docs)
# 实例化嵌入类
embeddings = DashScopeEmbeddings()
# 创建向量数据库,将文档向量化并保存到指定目录
db = Chroma.from_documents(texts, embeddings, persist_directory="./chroma")
# 持久化向量数据库
db.persist()
# 返回处理后的文档
return docs
def get_RAG2(y):
# 加载向量数据库,用于后续的相似内容检索
db = Chroma(persist_directory="./chroma", embedding_function=DashScopeEmbeddings())
# 根据输入的问题y,从数据库中检索最相似的内容
content = db.similarity_search(y, k=1)
# 定义回复模板,用于指导如何结合检索到的内容来回答问题
template = "请参照下面的内容回答问题:\n{context}\n问题:{question}"
# 初始化PromptTemplate对象,确保模板可以正确填充变量
promptTemplate = PromptTemplate(input_variables=["question", "context"], template=template)
# 根据模板和检索到的内容,生成用于提问的prompt
prompt = promptTemplate.format(question=y, context=content[0].page_content)
# 打印生成的prompt,便于调试和查看
print(prompt)
# 调用获取回复的函数(该函数是调用AI),得到回答
response = get_response(prompt)
# 返回得到的回答
return response
(2)写接口