RAG增强检索

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)写接口

RAG增强检索_第1张图片

你可能感兴趣的:(大模型,人工智能,数据库)