
AI聊天无敏感词:技术原理与应用实践
检索增强生成(RAG)是一种人工智能技术,旨在通过结合大语言模型(LLM)的通用知识与外部数据源中的特定信息,提高信息检索和生成的准确性和相关性。本文将深入探讨RAG的基本概念、技术实现,并展示如何通过LangChain、OpenAI和Weaviate等工具,将理论转化为实践。
随着大语言模型(LLM)的发展,人们开始探索如何将这些模型的通用知识与个人或特定领域的数据有效结合。RAG技术应运而生,它通过检索外部数据源中的信息来增强LLM的生成能力,减少误导性信息的产生。
RAG的工作流程包括三个主要步骤:检索、增强和生成。首先,根据用户的查询内容,从外部知识源获取相关信息;其次,将查询和检索到的信息一起嵌入到预设的提示模板中;最后,输入到LLM中生成所需的输出。
在实现RAG之前,需要安装和配置相关的Python包,包括langchain
、openai
和weaviate-client
。此外,还需要在项目根目录下的.env
文件中设置环境变量,以获取OpenAI的API密钥。
#!pip install langchain openai weaviate-client
OPENAI_API_KEY=""
import dotenv
dotenv.load_dotenv()
向量数据库作为外部知识源,包含了所有必要的额外信息。建立向量数据库需要收集数据、分块处理和嵌入存储。
使用TextLoader
加载数据,例如2022年拜登总统的国情咨文。
from langchain.document_loaders import TextLoader
loader = TextLoader('./state_of_the_union.txt')
documents = loader.load()
由于文档的大小超出了LLM处理窗口的限制,需要将其切割成更小的片段。
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)
使用OpenAI的嵌入模型生成向量嵌入,并存储在Weaviate向量数据库中。
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Weaviate
vectorstore = Weaviate.from_documents(documents=chunks, embedding=OpenAIEmbeddings(), by_text=False)
根据用户查询与已嵌入的文本块之间的语义相似度,检索出额外的上下文信息。
retriever = vectorstore.as_retriever()
准备一个提示模板,用额外的上下文信息来增强原始的提示。
from langchain.prompts import ChatPromptTemplate
template = """You are an assistant for question-answering tasks.
Use the following pieces of retrieved context to answer the question.
If you don't know the answer, just say that you don't know.
Use three sentences maximum and keep the answer concise.
Question: {question}
Context: {context}
Answer:
"""
prompt = ChatPromptTemplate.from_template(template)
结合检索器、提示模板与LLM,形成一个RAG序列,执行并生成回答。
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
rag_chain = ({"context": retriever, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser())
query = "What did the president say about Justice Breyer"
rag_chain.invoke(query)
问:RAG技术的主要优势是什么?
问:RAG的工作流程包括哪些步骤?
问:如何建立和使用向量数据库?
问:RAG技术在实际应用中需要注意哪些问题?
问:RAG技术的未来发展方向是什么?