下载模型

从huggingface或镜像网站下载生成式语言模型及ice_text.model文件,如chatglm3-6b-32k
https://huggingface.co/THUDM/chatglm3-6b-32k/tree/mainhttps://huggingface.co/THUDM/chatglm-6b/blob/main/ice_text.model

从github下载chatglm3的代码,解压后在项目的主目录建立model等文件夹放自己下载的模型,并将ice_text.model也放在模型文件夹

从huggingface或镜像网站下载生成文本嵌入模型,如bert-base-nli-mean-tokens ,其中1_Pooling、onnx和openvino可以不下载,否则加载模型时可能报错,下载后在项目的主目录建立其他文件夹放自己下载的模型,比如RAG(li)/embedding_model/bert-base-nli-mean-tokens

sentence-transformers/bert-base-nli-mean-tokens at main

从网上找一个文本或者自己编写,这里保存格式以docx为例,并保存在自己的文件夹。

代码实现

在RAG(li)建立rag.py,准备实现RAG增强检索。

首先,下载和导入必要的框架、包和模块。由于这里要下载的模块较多,基本是pip install 模块名可以完成,这里不做演示,注意像提示缺失docx模块时应该下载python-docx。另外,如果你不想用docx文件的话,是要导入对应的Loader,比如pdf对应PyPDFLoader。

from langchain_community.document_loaders import UnstructuredWordDocumentLoader#PyPDFLoader,Docx2txtLoader,TextLoader
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_chroma import Chroma

from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import LLMChain
from langchain_community.llms import HuggingFacePipeline

from transformers import AutoTokenizer, AutoModelForCausalLM,pipeline

加载文档,导入文本嵌入模型,其中embedding_model_path是你的文本嵌入模型路径。

# 加载文档
loader = UnstructuredWordDocumentLoader(r'E:\Project\ML\ChatGLM3\RAG(li)\file\中华人民共和国商标法.docx')
documents = loader.load()

embedding_model_path = r'E:/Project/ML/ChatGLM3/RAG(li)/embedding_model/bert-base-nli-mean-tokens'

# 定义文本嵌入模型
local_embeddings = HuggingFaceEmbeddings(model_name=embedding_model_path.replace('\\','/').split('/')[-1],cache_folder=embedding_model_path, model_kwargs = {'device': 'cuda'},encode_kwargs={'normalize_embeddings': True, 'batch_size': 16})  

创建向量存储,编写模板,并创建聊天提示对象,再将向量存储转换为检索器

template = """你是AI助手,请根据检索的上下文回答问题。如果不知道答案,请说我不知道,最多使用五句话,保持回答简结。
        {context}

        回答问题: {question}
    """

prompt = ChatPromptTemplate.from_template(template)#根据模板创建聊天提示对象,用于生成对话内容

retriever = vectorstore.as_retriever()#将向量存储转换为检索器,用于基于查询向量进行相关文档检索

加载本地生成模型和分词器,创建文本生成管道,并包装成Hugging Face语言模型对象,然后创建任务链对象,注意如果没有cuda改为cpu。

# 加载本地生成模型和分词器
model_path = r'E:\Project\ML\ChatGLM3\model\chatglm3-6b-32k'
tokenizer = AutoTokenizer.from_pretrained(model_path,trust_remote_code=True)#,model_max_length=512
model = AutoModelForCausalLM.from_pretrained(model_path,trust_remote_code=True)

#使用Hugging Face的pipeline函数创建文本生成管道,配置模型、tokenizer,以及生成参数。
pipe = pipeline(
    "text-generation", #chatglm传入这个参数不起作用,会有警告
    model=model, 
    tokenizer=tokenizer, 
    max_new_tokens=64, #64
    # do_sample=True,#是否使用采样,如果为False,则每次生成都是相同的,temperature参数无效
    # temperature=0.5,#0.0-1.0温度,值越大,生成结果越随机  
    # repetition_penalty=1.0,#重复惩罚,值越大,重复结果越少
    # top_k=50,#top_k采样,值越大,生成结果越随机
    # top_p=0.95,#top_p采样,值越大,生成结果越随机
    # max_length=1000,#最大长度
    # min_length=100,#最小长度
    # early_stopping=True,#是否提前停止
    # length_penalty=1.0,#长度惩罚,值越大,生成结果越短
    # num_beams=1,#束搜索,值越大,生成结果越稳定
    # num_beam_groups=1,#束搜索组数,值越大,生成结果越稳定
    device='cuda:0',  # 设置设备为GPU
)

llm = HuggingFacePipeline(pipeline=pipe)#将生成管道包装成Hugging Face语言模型对象,用于与任务链集成和调用。

chain = LLMChain(llm=llm, prompt=prompt)# 创建任务链对象,将LLM与提示模板结合,以生成基于输入上下文的自然语言输出。

提出问题,从向量存储检索与输入问题相似的文档集合,这里k也可设为1,将查询文档转化为上下文字符串。

question = "以三维标志申请注册商标什么形状不得注册?"#
docs = vectorstore.similarity_search(question,k=5)#从向量存储中检索与输入问题最相似的文档集合。
# 确保将文档内容格式化为字符串
#context = "\n".join(doc.page_content for doc in docs)
max_length = 512  #512 设置最大长度
context = "\n".join(doc.page_content for doc in docs).replace('\n\n', '\n')#可限制长度doc.page_content[:max_length]

运行问答链,打印响应和答案,注意提取答案与你的模板设置有关。

# 运行问答链
response = chain.invoke(input={"context": context, "question": question})
print('response:\n',response)
# print('context:\n',response['context'])
text=response['text'].replace('\n\n', '\n')
# print('text:\n',text)
#print("type(response['text'])",type(response['text']))#<class 'str'>

answer=text.split(f'回答问题: {question}')[-1].strip()
print('answer:\n', answer)

部分输出情况如下。

创作不易,禁止抄袭,转载请附上原文链接及标题

更多推荐