前言
随着人工智能的不断发展,大语言模型这门技术也越来越重要,很多人和企业都开始将大语言模型投入生产之中。本文将详细介绍基于自建知识库的本地大模型的具体代码实现方式。博主使用Mac系统,搭建了一个基于Langchain、Ollama、Chroma矢量数据库以及千帆大模型平台的框架示例。
提示:以下是本篇文章正文内容,案例仅供参考。
可以与 构建一个以RAG技术为核心功能的基于自建知识库的本地大模型(一)理论知识篇 搭配使用
一、数据库构建
1. 分割文档
博主在此处引入的是txt文件。如果是其他形式的文档请参考本系列第一篇文章。
在文本分割部分,我建议加入分割符,可以提高RAG的效率和准确性。
# document_path 表示想要读取文章的路径
from langchain_text_splitters import CharacterTextSplitter
def split_documents(document_path):
# 获取txt文件信息
with open(document_path,encoding='utf-8') as f:
txt_document = f.read()
#设定文档分割模版
text_splitter = CharacterTextSplitter(
separator="\n",
chunk_size=500,
chunk_overlap=0,
is_separator_regex=False,
)
documents = text_splitter.create_documents([txt_document])
return documents
2.初始化数据库
# documents表示已分割好的文档,embeddings表示嵌入模型,persist_directory表示数据库永久保存的地址
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import Chroma
def initialize_vector_store(documents, embeddings, persist_directory):
docsearch = Chroma.from_documents(documents, embeddings, persist_directory=persist_directory)
docsearch.persist() #数据库永久化
return
二、问答调用
1. 创建文档链
# model_name表示你想选择的model名称,例如你选择使用ollama中的llama2,那么model_name = ”llama2“
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains.combine_documents import create_stuff_documents_chain
def create_document_chain(model_name):
llm = Ollama(model=model_name)
prompt = ChatPromptTemplate.from_template("""仅根据所提供的上下文回答以下问题,如果与上下文无关就回答“抱歉我不太清楚”:
<context>
{context}
</context>
问题: {input}""")
return create_stuff_documents_chain(llm, prompt)
2. 加载数据库
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import Chroma
def load_vectordatabase(persist_directory):
embeddings = OllamaEmbeddings(model="herald/dmeta-embedding-zh:latest")
docsearch = Chroma(persist_directory= persist_directory, embedding_function=embeddings)
return docsearch
注意: embedding模型在存入数据库和加载数据库时要保持一致
3. 创造检索链
from langchain.chains import create_retrieval_chain
def create_retrieval_chain_from_store(docsearch, document_chain):
retriever = docsearch.as_retriever()
return create_retrieval_chain(retriever, document_chain)
4. 大模型对话
question = input("请输入你的问题:")
response = retrieval_chain.invoke({"input": question})
answer = response["answer"]
print(answer)
总结
本文主要讲了构建一个以RAG技术为核心功能的基于自建知识库的本地大模型的具体代码实现。