赞
踩
生成式人工智能以其创造与上下文相关内容的能力彻底改变了技术,开创了人工智能可能性的新时代。其核心是检索增强生成(RAG),将信息检索与LLM相结合,从外部文档中产生智能、知情的响应。
本文将深入研究使用ChromaDB构建RAG驱动的LLM应用程序,ChromaDB以其对大型数据集的高效处理而闻名。
要构建基于RAG的LLM应用程序,需要准备如下环境配置:
以及对Python和web API的基本理解。
在终端中,创建一个新目录并导航到该目录:
mkdir rag_lmm_application
cd rag_lmm_application
虚拟环境可以隔离不同的python环境,创建命令如下所示:
python -m venv venv
激活虚拟环境。对于Mac/Linux用户,请使用:
source venv/bin/activate
对于Windows用户:
venv\Scripts\activate
安装基本库:
pip install -r requirements.txt
PS:确保requirements.txt文件中包含所有必要的依赖项。
通过上述步骤,环境已经准备就绪,下面开始使用ChromaDB构建最先进的RAG聊天应用程序。
下面使用LangChain来加载各种文档格式,如PDF、DOCX和TXT,这对于外部数据访问、确保高效的数据处理以及为后续阶段保持统一的数据准备至关重要。代码如下:
# loading PDF, DOCX and TXT files as LangChain Documents
def load_document(file):
import os
name, extension = os.path.splitext(file)
if extension == '.pdf':
from langchain.document_loaders import PyPDFLoader
print(f'Loading {file}')
loader = PyPDFLoader(file)
elif extension == '.docx':
from langchain.document_loaders import Docx2txtLoader
print(f'Loading {file}')
loader = Docx2txtLoader(file)
elif extension == '.txt':
from langchain.document_loaders import TextLoader
loader = TextLoader(file)
else:
print('Document format is not supported!')
return None
data = loader.load()
return data
数据分块对RAG系统非常重要,对数据进行分块以便于嵌入,这确保可以保留高效的上下文和信息检索。代码如下:
# splitting data in chunks
def chunk_data(data, chunk_size=256, chunk_overlap=20):
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
chunks = text_splitter.split_documents(data)
return chunks
使用OpenAI大模型来创建嵌入,并将它们高效地存储在ChromaDB中,可以快速检索信息,代码如下所示:
# create embeddings using OpenAIEmbeddings() and save them in a Chroma vector store
def create_embeddings(chunks):
embeddings = OpenAIEmbeddings()
vector_store = Chroma.from_documents(chunks, embeddings)
# if you want to use a specific directory for chromadb
# vector_store = Chroma.from_documents(chunks, embeddings, persist_directory='./mychroma_db')
return vector_store
Streamlit的简单性在我们的RAG LLM应用程序中大放异彩,可以毫不费力地将用户输入链接到后端处理。通过Streamlit的初始化和布局设计,用户可以上传文档和管理数据。后端处理这些输入,直接在Streamlit界面中返回响应,展示了前端和后端操作的无缝集成。下面是一个代码片段来说明设置:
def ask_and_get_answer(vector_store, q, k=3):
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model='gpt-3.5-turbo', temperature=1)
retriever = vector_store.as_retriever(search_type='similarity', search_kwargs={'k': k})
chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)
answer = chain.run(q)
return answer
# calculate embedding cost using tiktoken
def calculate_embedding_cost(texts):
import tiktoken
enc = tiktoken.encoding_for_model('text-embedding-ada-002')
total_tokens = sum([len(enc.encode(page.page_content)) for page in texts])
# print(f'Total Tokens: {total_tokens}')
# print(f'Embedding Cost in USD: {total_tokens / 1000 * 0.0004:.6f}')
return total_tokens, total_tokens / 1000 * 0.0004
# clear the chat history from streamlit session state
def clear_history():
if 'history' in st.session_state:
del st.session_state['history']
if __name__ == "__main__":
import os
# loading the OpenAI api key from .env
from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv(), override=True)
st.image('img.png')
st.subheader('LLM Question-Answering Application 声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/829344
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。