RAG:本地部署Langchain🦜🔗-Ollma🐫(Windows)
RAG,即“Retrieval Augmented Generation”(检索增强生成),是一种结合了检索和生成技术的自然语言处理模型。它主要用于文本生成任务,能够利用外部知识源来增强生成的文本,从而提高生成质量。相较于微调技术,RAG能够更加短平快的吸纳本地知识并整合大模型进行问答。因此本地部署了一个基于Langchain🦜🔗 + Ollma🐫的RAG应用,以检索本地知识库生成回答。
1. 创建conda虚拟环境
首先,在Anaconda Prompt中创建名为 LLMs 的conda环境,并指定Python版本为3.10。其次,激活该名为 LLMs 的conda环境。
# 创建新环境
conda create --name LLMs python=3.10
# 激活该环境
conda activate LLMs
2. 安装Langchain🦜🔗
2.1 Langchain简介
🦜🔗Langchain 是一个用于开发由大语言模型(LLMs)提供支持的应用程序框架。Langchain简化了 LLMs应用生命周期的每个阶段,其主要特点包括:
- 开发:使用 LangChain 的开源构建块和组件构建应用程序,利用第三方集成和模板快速启动。
- 生产:使用 LangSmith 检查、监控和评估,保障持续优化和稳定部署。
- 部署:使用 LangServe 将任何链(chian)转换为 API。
2.2 安装🦜🔗Langchain相关的🐍Python库
在上述已经创建的LLMs的新环境中继续安装所需要的Langchain相关的🐍Python库:
- langchain
- langchain_text_splitters
- langchain-chroma
- langchain-huggingface
选择conda或pip安装:
conda install langchain -c conda-forge
conda install langchain_text_splitters
conda install langchain-chroma -c conda-forge
conda install langchain-huggingface -c conda-forge
pip install -U langchain-community
2.3 安装Ollama
由于知识库问答的底座大模型选择了Ollama所整合的模型,因此需要提前在本地下载安装Ollama🐫。
- Windows版本下载:Download。
- 下载安装后进入到CMD中运行Ollama🐫中的 Llama 3模型仅需要一行命令即可:
ollama run llama3
,首次运行会先下载模型文件,需要等待一段时间。 ollama serve
即可运行Ollama🐫的服务器模式,但在运行服务器模式之前请确保关闭Ollama,详情可参考“Error: listen tcp 127.0.0.1:11434: bind: Only one usage of each socket address”。
3. 导入外部文件,进行文本分割
3.1 需要导入的库
# 将文本分割成更小的部分以进行处理
from langchain_text_splitters import RecursiveCharacterTextSplitter# 读入txt文件
from langchain.document_loaders import TextLoader# Emdedding模型
from langchain.embeddings import HuggingFaceBgeEmbeddings# 向量数据库Chroma
from langchain.vectorstores import Chroma
3.2 导入本地的文本文件
# 导入本地文本
loader = TextLoader("test.txt",encoding='utf-8')
data = loader.load()# 将文本分割成长度为200个字符的小块,并且每个小块之间有20个字符的重叠
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=20)
all_splits = text_splitter.split_documents(data)
3.3 Embedding模型
由于读入的外部文件既有中文又有英文,因此Embedding模型的选择至关重要。此处选择已经下载在本地的智源BAAI/BGE-M3模型(支持多语言(Multi-Linguality)、多粒度(Multi-Granularity)、多功能(Multi-Functionality))来对分割后的文本进行Embedding向量化。
embedding_function = HuggingFaceBgeEmbeddings(model_name="BAAI/bge-m3")
4.导入向量数据库Chroma
vectorstore_torist = Chroma.from_documents(all_splits, embedding_function, persist_directory="./vector_store")
不知道为什么,这一步在win系统中很慢,也许和本地的GPU显卡太拉有关系?
5. 启动Ollama服务
# 使用Ollama:llama3
OLLAMA_MODEL='llama3'# 在操作系统级别设置该环境
os.environ['OLLAMA_MODEL'] = OLLAMA_MODEL
!echo $OLLAMA_MODEL# 启动Ollama服务
!ollama serve
6. 构建RAG Chain
from langchain_core.output_parsers import StrOutputParser
from langchain.prompts import ChatPromptTemplate
from langchain_community.chat_models import ChatOllama
from langchain_core.runnables import RunnableLambda, RunnablePassthrough# Prompt设定输出为中文,并且将其上下文设置为向量数据库中的内容
template = """
Answer the question based only on the following context, and output in Chinese:
{context}
Question: {question}
"""retriever = vectorstore.as_retriever()
prompt = ChatPromptTemplate.from_template(template)# 采用本地的大语言模型llama3对话
ollama_llm = "llama3"
model_local = ChatOllama(model=ollama_llm)# Chain
chain = ({"context": retriever, "question": RunnablePassthrough()}| prompt| model_local| StrOutputParser()
)
利用test.txt文件中内容对话测试:
chain.invoke("test.txt文件中内容")