构建一个以RAG技术为核心功能的基于自建知识库的本地大模型(三)代码实现篇


前言

随着人工智能的不断发展,大语言模型这门技术也越来越重要,很多人和企业都开始将大语言模型投入生产之中。本文将详细介绍基于自建知识库的本地大模型的具体代码实现方式。博主使用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技术为核心功能的基于自建知识库的本地大模型的具体代码实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值