3.langchain系列3——chatglm3量化和rag四大名著进行问答

本文主要内容:

  1. bitsandbytes 量化
  2. llama_index 对多文档切分和节点信息
  3. faiss 使用
  4. 原始回答和 RAG 效果比较

不足之处,现在划分的 chunk_size 太小了,bge 最大输入是 512,并且没有层级关系,如果按照章节划分等形成文档树会好很多。

四大名著的 txt来自于。8G 的显存就可跑起来。

1. 使用 bitsandbytes 对 chatglm3-6b 量化

bitsandbytes 是一个高效的用于对 LLM(Large Language Models)进行量化的工具包。该工具包由 Tim Dettmers 创建,旨在提供对大型语言模型进行位宽量化的功能,以降低模型的计算和存储开销,同时保持尽可能高的性能。

对于 chatglm3-6b 的进行 4bit 量化,从 12227MB 的内存消耗中节省到 4771MB,实现了约 60% 的显存优化。

import os
import torch
import torch.nn as nn
from transformers import (AutoConfig,
                          AutoModel,
                          AutoTokenizer,
                          BitsAndBytesConfig
                          )
import warnings
warnings.filterwarnings('ignore')


import torch
class Config:
    def __init__(self):
        self.model_name = r"./chatglm3-6b"
        self.use_4bit = True
        self.bnb_4bit_compute_dtype = "float16"
        self.bnb_4bit_quant_type = 'nf4'
        self.use_nested_quant = False
        self.compute_dtype = getattr(torch, self.bnb_4bit_compute_dtype)
        self.chunk_size = 512
        self.small_size = 128
        self.emb_model_name = "BAAI/bge-large-zh-v1.5"
        self.input_text1 = "刘备第一次遇见关羽?"
        self.input_text2 = "曹操在哪和袁绍决战,烧毁了袁绍哪儿的粮草才取胜的?"
        self.input_text3 = "孙权第一次立的太子是谁,在什么时间被废?"

cfg = Config()

tokenizer = AutoTokenizer.from_pretrained(cfg.model_name,
                                          trust_remote_code=True,
                                          use_fast=True,
                                          pad_token_id=2
                                          )

bnb_config = BitsAndBytesConfig(
            load_in_4bit=cfg.use_4bit,
            bnb_4bit_quant_type=cfg.bnb_4bit_quant_type,
            bnb_4bit_compute_dtype=cfg.compute_dtype,
            bnb_4bit_use_double_quant=cfg.use_nested_quant

)

model = AutoModel.from_pretrained(
        cfg.model_name,
        trust_remote_code=True,
        quantization_config = bnb_config
)

history = []
response, history = model.chat(tokenizer, cfg.input_text1, history=history)
print(response)

回答是 刘备遇见关羽是在《三国演义》中,刘备是蜀汉的开国皇帝,关羽则是刘备麾下的重要将领。在故事中,刘备三顾茅庐才请出诸葛亮,后来关羽加入刘备的队伍,成为他的亲密战友。这个就很胡编了。另外也可试试其他的回答。

2. 对 4 大名著切分设置 node_info 和 faiss 检索

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS

from llama_index import Document
from llama_hub.file.unstructured import UnstructuredReader
from llama_index.node_parser import SentenceSplitter
from llama_index.schema import IndexNode

def find_files(directory, file_suffix='*.txt'):
  import glob
  file_paths = glob.glob(os.path.join(directory, file_suffix))

  return file_paths

def chunk_docs_and_add_node(data_dir, chunk_size):
    file_paths = find_files(data_dir)
    all_nodes = []
    names = ['红楼梦', '三国演义', '水浒传', '西游记']
    for i, file in enumerate(file_paths):
        file_name = os.path.splitext(os.path.basename(file))[0]
        # print(file_name)
        loader = UnstructuredReader()
        documents = loader.load_data(file=file)
        doc_text = "\n\n".join([d.get_content() for d in documents])
        docs = [Document(text=doc_text)]

        node_parser = SentenceSplitter(chunk_size=chunk_size)
        nodes = node_parser.get_nodes_from_documents(docs)
        # set node ids to be a constant
        for idx, node in enumerate(nodes):
#             print(f"{names[i]}-{idx}")
            node.id_ = f"{file_name}-{idx}"

        all_nodes.extend(nodes)

    return all_nodes

all_nodes = chunk_docs_and_add_node('./data', chunk_size=cfg.chunk_size)

from langchain.docstore.document import Document

docs = [Document(page_content=node.node_id + ":" + node.get_text()) for node in all_nodes]

from langchain.vectorstores.faiss import FAISS
from langchain_community.embeddings import HuggingFaceBgeEmbeddings

model_name = cfg.emb_model_name
model_kwargs = {"device": "cuda"}
encode_kwargs = {
        "batch_size":8,
        "normalize_embeddings": True
}
hf = HuggingFaceBgeEmbeddings(
                model_name=model_name,
                model_kwargs=model_kwargs,
                encode_kwargs=encode_kwargs,

)
db = FAISS.from_documents(docs, hf)

例如,embedding 部分还可以微调,这里有个开箱即用的包 还有

docs = db.similarity_search(cfg.input_text1, k=3)
print(f"相关文档有:")
for i,c in enumerate(docs):
    print(i, ":", c.page_content.replace("\n", ''), end='\n\n')

检索到的片段如下,效果不太好,检索到有部分是三顾诸葛亮的部分。是不是 bge-large-zh-v1.5 中文语料跟这个相关的太多了。也有比较好的,下面检索回答再说。

{
相关文档有:
0 : "三国演义 -593:”关公大惊,急退左右,问曰:“先生此来,必有所为?”震出书一缄,递与关公。公视之,乃玄德书也。其略云:备与足下,自桃园缔盟,誓以同死。今何中道相违,割恩断义?君必欲取功名、图富贵,愿献备首级以成全功。书不尽言,死待来命。关公看书毕,大哭曰:“某非不欲寻兄,奈不知所在也。安肯图富贵而背旧盟乎?”震曰:“玄德望公甚切,公既不背旧盟,宜速往见。”关公曰:“人生天地间,无终始者,非君子也。吾来时明白,去时不可不明白。吾今作书,烦公先达知兄长,容某辞却曹操,奉二嫂来相见。”震曰:“倘曹操不允。为之奈何?”公曰:“吾宁死,岂肯久留于此!震曰:“公速作回书,免致刘使君悬望。”关公写书答云:窃闻义不负心,忠不顾死。羽自幼读书,粗知礼义,观羊角哀、左伯桃之事,未尝不三叹而流涕也。前守下邳。",

1 : "三国演义 -841: 不期为尊客所闻。”玄德曰:“曾见令婿否?”承彦曰:“便是老夫也来看他。”玄德闻言,辞别承彦,上马而归。正值风雪又大,回望卧龙冈,悒怏不已。后人有诗单道玄德风雪访孔明。诗曰:一天风雪访贤良,不遇空回意感伤。冻合溪桥山石滑,寒侵鞍马路途长。当头片片梨花落,扑面纷纷柳絮狂。回首停鞭遥望处,烂银堆满卧龙冈。玄德回新野之后,光阴荏苒,又早新春。乃令卜者揲蓍,选择吉期,斋戒三日,薰沐更衣,再往卧龙冈谒孔明。关、张闻之不悦,遂一齐入谏玄德。正是:高贤未服英雄志,屈节偏生杰士疑。未知其言若何,下文便晓。第三十八回 定三分隆中决策 战长江孙氏报仇却说玄德访孔明两次不遇,欲再往访之。关公曰:“兄长两次亲往拜谒,其礼太过矣。想诸葛亮有虚名而无实学,故避而不敢见。兄何惑于斯人之甚也!",

2 : "三国演义 -790:”玄德曰:“偶尔经由此地,因小童相指,得拜尊颜,不胜万幸!”水镜笑曰:“公不必隐讳。公今必逃难至此。”玄德遂以襄阳一事告之。水镜曰:“吾观公气色,已知之矣。”因问玄德曰:“吾久闻明公大名,何故至今犹落魄不偶耶?”玄德曰:“命途多蹇,所以至此。”水镜曰:“不然。盖因将军左右不得其人耳。”玄德曰:“备虽不才,文有孙乾、糜竺、简雍之辈,武有关、张、赵云之流,竭忠辅相,颇赖其力。”水镜曰:“关、张、赵云,皆万人敌,惜无善用之之人。若孙乾、糜竺辈,乃白面书生,非经纶济世之才也。”玄德曰:“备亦尝侧身以求山谷之遗贤,奈未遇其人何!”水镜曰:“岂不闻孔子云十室之邑必有忠信,何谓无人?”玄德曰:“备愚昧不识,愿赐指教。”水镜曰:“公闻荆襄诸郡小儿谣言乎?其谣曰:八九年间始欲衰,至十三年无孑遗。到头天命有所归,泥中蟠龙向天飞。"
}

3. RAG

使用 ChatGLM3 这类模型,要结合 LangChain 的 Chain 功能,通常需要将模型通过 pipeline 封装,以便转换为 HuggingFacePipeline 对象。

from transformers import pipeline
from langchain.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain.chains.question_answering import load_qa_chain
from langchain.chains import LLMChain
from langchain.llms.huggingface_pipeline import HuggingFacePipeline

text_generation_pipeline = pipeline(
    model=model,
    tokenizer=tokenizer,
    task="text-generation",
    temperature=0.,
    repetition_penalty=1.1,
    return_full_text=True,
    max_new_tokens=2048,
    do_sample=False
)

chatglm_llm = HuggingFacePipeline(pipeline=text_generation_pipeline)

接下来实现检索到相关的上下文和 llm 生成答案。

prompt_template = """
            尽可能详细地回答问题,从提供的上下文中提供所有细节。如果答案不在提供的上下文中,请说“答案在上下文中不可用”,不要提供错误的答案。\n\n
            上下文:\n {context}?\n
            问题: \n{question}\n

            答案:
    """prompt = PromptTemplate(template=prompt_template, input_variables=["context","question"])
llm_chain = LLMChain(llm=chatglm_llm, prompt=prompt)


def user_input(user_question, llm_chain, db, return_context=True):
    retriever = db.as_retriever(
        search_type="similarity",
        search_kwargs={'k': 3},

    )


    chain = (
        {
        "context": retriever,
        "question": RunnablePassthrough()}
    | llm_chain)

    response = chain.invoke(user_question)
    if return_context:
        return response
    return response['text']

看看一些例子:

response = user_input(cfg.input_text1, llm_chain, db)
from rich import print
print(response)

回答比直接回答要好一些:

{
    'context': [
        Document(
            page_content=' 三国演义 -593:”关公大惊,急退左右,问曰:“先生此来,必有所为?”震出书一缄,递与关公。公视之,乃玄德书也。其略云:\n\n 备与足下,自
桃园缔盟,誓以同死。今何中道相违,割恩断义?君必欲取功名、图富贵,愿献备首级以成全功。书不尽言,死待来命。\n\n 关公
看书毕,大哭曰:“某非不欲寻兄,奈不知所在也。安肯图富贵而背旧盟乎?”震曰:“玄德望公甚切,公既不背旧盟,宜速往见。”关公曰:“人生天地间,无终始者,非君子也。吾来时明白,去时不可不明白。吾今作书,烦公先达知兄长,容某辞却曹操,奉二嫂
来相见。”震曰:“倘曹操不允。为之奈何?”公曰:“吾宁死,岂肯久留于此!震曰:“公速作回书,免致刘使君悬望。”关公写书答
云:\n\n 窃闻义不负心,忠不顾死。羽自幼读书,粗知礼义,观羊角哀、左伯桃之事,未尝不三叹而流涕也。前守下邳。'
        ),
        Document(
            page_content=' 三国演义 -841: 
不期为尊客所闻。”玄德曰:“曾见令婿否?”承彦曰:“便是老夫也来看他。”玄德闻言,辞别承彦,上马而归。正值风雪又大,回望
卧龙冈,悒怏不已。后人有诗单道玄德风雪访孔明。诗曰:\n\n 一天风雪访贤良,不遇空回意感伤。冻合溪桥山石滑,寒侵鞍马路
途长。\n\n 当头片片梨花落,扑面纷纷柳絮狂。回首停鞭遥望处,烂银堆满卧龙冈。\n\n 玄德回新野之后,光阴荏苒,又早新春。乃令卜者揲蓍,选择吉期,斋戒三日,薰沐更衣,再往卧龙冈谒孔明。关、张闻之不悦,遂一齐入谏玄德。正是:\n\n 高贤未服英
雄志,屈节偏生杰士疑。\n\n 未知其言若何,下文便晓。\n\n 第三十八回 定三分隆中决策 
战长江孙氏报仇 \n\n 却说玄德访孔明两次不遇,欲再往访之。关公曰:“兄长两次亲往拜谒,其礼太过矣。想诸葛亮有虚名而无实学,故避而不敢见。兄何惑于斯人之甚也!'
        ),
        Document(
            page_content=' 三国演义 -790:”玄德曰:“偶尔经由此地,因小童相指,得拜尊颜,不胜万幸!”水镜笑曰:“公不必隐讳。公今必逃难至此。”玄德遂以襄阳一事告
之。水镜曰:“吾观公气色,已知之矣。”因问玄德曰:“吾久闻明公大名,何故至今犹落魄不偶耶?”玄德曰:“命途多蹇,所以至此。”水镜曰:“不然。盖因将军左右不得其人耳。”\n\n 玄德曰:“备虽不才,文有孙乾、糜竺、简雍之辈,武有关、张、赵云之流,竭忠辅相,颇赖其力。”水镜曰:“关、张、赵云,皆万人敌,惜无善用之之人。若孙乾、糜竺辈,乃白面书生,非经纶济世之才也。”玄德曰:“备亦尝侧身以求山谷之遗贤,奈未遇其人何!”水镜曰:“岂不闻孔子云十室之邑必有忠信,何谓无人?”玄德曰:“备
愚昧不识,愿赐指教。”水镜曰:“公闻荆襄诸郡小儿谣言乎?其谣曰:八九年间始欲衰,至十三年无孑遗。到头天命有所归,泥中
蟠龙向天飞。'
        )
    ],
    'question': '刘备在什么时候遇见关羽?',
    'text': '刘备在《三国演义》中的第一次遇见关羽是在桃园缔盟之后,当时刘备与关羽、张飞结为兄弟,共同创业。'
}

效果对比

红楼梦 Q1

user_question = "刘姥姥进大观园都得了哪些东西?"
response = user_input(user_question, llm_chain, db)
print(response)

直接回答,使用量化后的 4bit 模型直接回答,后面都是这样

response, history = model.chat(tokenizer, user_question, history=[])
print(response)

回答:

《刘姥姥进大观园》是曹雪芹所著中国古典文学名著《红楼梦》中的一段情节。这段情节中,刘姥姥因为久仰贾府的名声,便来到
了荣国府,并得到了贾母的接见。在这次拜访中,刘姥姥得到了许多珍稀的礼物,如贾母赐给她的金条、贾宝玉送她的青云锁等。此外,刘姥姥还看到了贾府中许多稀奇古怪的景物,如贾宝玉与林黛玉、薛宝钗等人的爱情故事。

RAG 回答:好一点吧。

{
    'context': [
        Document(
            page_content=' 红楼梦 -1184:”凤姐儿听了,自是欢喜,忙谢道:“只保佑他应了你的话就好了。”说着,叫平儿来吩咐道:“明儿咱们有事,恐怕不得闲儿,你这
会子闲着,把送姥姥的东西打点了,他明儿一早就好走的便宜了。”\n\n 刘姥姥道:“不敢多破费了。已经遭扰了几天,又拿着走,越发心里不安了。”凤姐儿笑道:“也没有什么,不过随常的东西。好也罢,歹也罢,带了去,你们街坊邻舍看着也热闹些,也是上
城一趟。”说着只见平儿走来说:“姥姥过这边瞧瞧。”刘姥姥忙跟了平儿到那边屋里,只见堆着半炕东西。平儿一一的拿给他瞧着,又说道:“这是昨日你要的青纱一匹,奶奶另外送你一个实地月白纱做里子。这是两个茧绸,做袄儿裙子都好。这包袱里是两匹绸子,年下做件衣裳穿。这是一盒子各样内造小饽饽儿,也有你吃过的,也有没吃过的,拿去摆碟子请人,比买的强些。'
        ),
        Document(
            page_content=' 红楼梦 -1193: 
我有好些呢。留着年下给小孩子们罢。”说着,只见一个小丫头拿着个成窑钟子来,递给刘姥姥,说:“这是宝二爷给你的。”刘姥姥
道:“这是那里说起?我那一世修来的,今儿这样!”说着便接过来。鸳鸯道:“前儿我叫你洗澡,换的衣裳是我的,你不弃嫌,我还
有几件也送你罢。”刘姥姥又忙道谢。鸳鸯果然又拿出几件来,给他包好。刘姥姥又要到园中辞谢宝玉和众姊妹王夫人等去,鸳鸯道:“不用去了。他们这会子也不见人,回来我替你说罢。闲了再来。”又命了一个老婆子,吩咐他:“二门上叫两个小厮来,帮着姥姥
拿了东西送去。”婆子答应了。又和刘姥姥到了凤姐儿那边,一并拿了东西,在角门上命小厮门搬出去,直送刘姥姥上车去了,不在
话下。\n\n 且说宝钗等吃过早饭,又往贾母处问安,回园至分路之处,宝钗便叫黛玉道:“颦儿跟我来!有一句话问你。”黛玉便笑
着跟了来。'
        ),
        Document(
            page_content=' 红楼梦 -1192: 
老太太从不穿人家做的,收着也可惜,却是一次也没穿过的,昨日叫我拿出两套来送你带了去,或送人,或自己家里穿罢。这盒子
里头是你要的面果子。这包儿里头是你前儿说的药,梅花点舌丹也有,紫金锭也有,活络丹也有,催生保命丹也有:每一样是一张
方子包着,总包在里头了。这是两个荷包,带着玩罢。”说着,又抽开系子,掏出两个“笔锭如意”的锞子来给他瞧,又笑道:“荷包
你拿去,这个留下给我罢。”刘姥姥已喜出望外,早又念了几千佛,听鸳鸯如此说,便忙说道:“姑娘只管留下罢。”鸳鸯见他信以为
真,笑着仍给他装上,说道:“哄你玩呢!我有好些呢。留着年下给小孩子们罢。”说着,只见一个小丫头拿着个成窑钟子来,递给
刘姥姥,说:“这是宝二爷给你的。”刘姥姥道:“这是那里说起?我那一世修来的,今儿这样!”说着便接过来。鸳鸯道:“前儿我叫
你洗澡,换的衣裳是我的,你不弃嫌,我还有几件也送你罢。”刘姥姥又忙道谢。'
        )
    ],
    'question': '刘姥姥进大观园都得了哪些东西?',
    'text': '刘姥姥进大观园得到了许多东西,包括青纱、实地月白纱、茧绸、绸子、各样内造小馒头、面果子、药、锞子等。'
}

水浒传 Q1

user_question = "武松杀死西门庆后被流放到哪里?"
response = user_input(user_question, llm_chain, db)
print(response)

回答:

武松杀死西门庆后,因遭受官府通缉,被流放到了外地。具体来说,武松被流放到恩州(今甘肃省庆阳市)。在《水浒传》中,武
松在杀掉西门庆后,为了躲避官府的追捕,便离开清河县,前往他人在恩州避难。后来,武松在恩州结识了鲁智深,两人结为兄弟。

RAG 回答:这个效果非常好,检索到了答案,相对比原来的回答具体很多。

{
    'context': [
        Document(
            page_content=' 水浒传 -941: 
据武松虽系报兄之仇,斗杀西门庆奸夫人命,亦则自首,难以释免:脊杖四十,刺配二千里外。奸夫淫妇虽该重罪,已死勿论。其
余一干人犯释放宁家。文书到日,即便施行。”东平府尹陈文昭看了来文,随即行移,拘到何九叔、郓哥并四家邻舍和西门庆妻小,一干人等都到厅前听断。牢中取出武松,读了朝廷明降,开了长枷,脊杖四十。上下公人都看觑他,止有五七下着肉。取一面七斤
半铁叶团头护身枷钉了,脸上免不得刺了两行金印,迭配孟州牢城。其余一干众人,省谕发落,各放宁家。大牢里取出王婆,当厅
听命。读了朝廷明降,写了犯由牌,画了伏状,便把这婆子推上木驴,四道长钉,三条绑索,东平府尹判了一个剐字,拥出长街。两声破鼓响,一棒碎锣鸣,犯由前引,混棍后催,两把尖刀举,一朵纸花摇,带去东平府市心里,吃了一剐。\n\n 话里只说武松带
上行枷,看剐了王婆。'
        ),
        Document(
            page_content=' 水浒传 -928: 
肐查一刀,便割下那妇人头来,血流满地。四家邻舍,吃了一惊,都掩了脸。见他凶了,又不敢动,只得随顺他。武松叫土兵去楼
上取下一床被来,把妇人头包了,揩了刀,插在鞘里。洗了手,唱个喏,说道:“有劳高邻,甚是休怪。且请众位楼上少坐,待武二
便来。”四家邻舍都面面相看,不敢不依他,只得都上楼去坐了。武松分付土兵,也教押那婆子上楼去。关了楼门,着两个土兵在楼
下看守。\n\n 武松包了妇人那颗头,一直奔西门庆生药铺前来,看着主管唱个喏:“大官人宅上在么?”主管道:“却才出去。”武松
道:“借一步,闲说一句话。”那主管也有些认得武松,不敢不出来。武松一引引到侧首僻净巷内,武松翻过脸来道:“你要死却是要
活?”主管慌道:“都头在上,小人又不曾伤犯了都头。”武松道:“你要死,休说西门庆去向;你若要活,实对我说,西门庆在那里?”主管道:“却才和一个相识,去狮子桥下大酒楼上吃酒。'
        ),
        Document(
            page_content=' 水浒传 -932:”\n\n 那西门庆一者冤魂缠定,二乃天理难容,三来怎当武松勇力。只见头在下,脚在上,倒撞落在当街心里去了,跌得个发昏章第
十一。街上两边人都吃了一惊。武松伸手去凳子边提了淫妇的头,也钻出窗子外,涌身望下只一跳,跳在当街上。先抢了那口刀在
手里,看这西门庆已自跌得半死,直挺挺在地下,只把眼来动。武松按住,只一刀,割下西门庆的头来.把两颗头相结做一处,提
在手里,把着那口刀,一直奔回紫石街来.叫土兵开了门,将两颗人头供养在灵前,把那碗冷酒浇奠了,说道:“哥哥魂灵不远,早
生天界!兄弟与你报仇,杀了奸夫和淫妇。今日就行烧化。”便叫土兵,楼上请高邻下来,把那婆子押在前面。武松拿着刀,提了两
颗人头,再对四家邻舍道:“我还有一句话,对你们四位高邻说则个。”那四家邻舍叉手拱立,尽道:“都头但说,我众人一听尊命。”武松说出这几句话来,有分教:\n\n 名标千古,声播万年。'
        )
    ],
    'question': '武松杀死西门庆后被流放到哪里?',
    'text': '武松杀死西门庆后被流放到孟州牢城。'
}

西游记 Q1

user_question = "孙悟空取经后被封为什么职位?"
response = user_input(user_question, llm_chain, db)
print(response)

回答:

孙悟空在《西游记》中取经成功后,被封为“斗战胜佛”。这是因为在取经过程中,孙悟空凭借着自己的勇敢、智慧和战斗力,多次
战胜了妖魔鬼怪,帮助唐僧成功取得真经。因此,孙悟空被尊奉为斗战胜佛,成为了佛教中的保护神。

RAG 回答:这个也比较好,看起来利用了检索到的上下文。

{
    'context': [
        Document(
            page_content=' 西游记 -3174: 
此时灵山诸神,都在佛前听讲。八金刚引他师徒进去,对如来道:“弟子前奉金旨,驾送圣僧等,已到唐国,将经交纳,今特缴旨。”遂叫唐僧等近前受职。如来道:“圣僧,汝前世原是我之二徒,名唤金蝉子。因为汝不听说法,轻慢我之大教,故贬汝之真灵,转
生东土。今喜皈依,秉我迦持,又乘吾教,取去真经,甚有功果,加升大职正果,汝为旃檀功德佛。孙悟空,汝因大闹天宫,吾以
甚深法力,压在五行山下,幸天灾满足,归于释教,且喜汝隐恶扬善,在途中炼魔降怪有功,全终全始,加升大职正果,汝为斗战
胜佛。猪悟能,汝本天河水神,天蓬元帅,为汝蟠桃会上酗酒戏了仙娥,贬汝下界投胎,身如畜类,幸汝记爱人身,在福陵山云栈
洞造孽,喜归大教,入吾沙门,保圣僧在路,却又有顽心,色情未泯,因汝挑担有功,加升汝职正果,做净坛使者。'
        ),
        Document(
            page_content=' 西游记 -3173:”这底下行者三人,连白马平地而起,长老亦将经卷丢下,也从台上起于九霄,相随腾空而去,慌得那太宗与多官望空下拜。这正是:\n\n 圣僧努力取经编,西宇周流十四年。苦历程途遭患难,多经山水受迍邅。\n\n 功完八九还加九,行满三千及大千。大觉妙文
回上国,至今东土永留传。\n\n 太宗与多官拜毕,即选高僧,就于雁塔寺里,修建水陆大会,看诵《大藏真经》,超脱幽冥孽鬼,普施善庆,将誊录过经文,传布天下不题。却说八大金刚,驾香风,引着长老四众,连马五口,复转灵山,连去连来,适在八日之
内。此时灵山诸神,都在佛前听讲。八金刚引他师徒进去,对如来道:“弟子前奉金旨,驾送圣僧等,已到唐国,将经交纳,今特缴
旨。”遂叫唐僧等近前受职。如来道:“圣僧,汝前世原是我之二徒,名唤金蝉子。因为汝不听说法,轻慢我之大教,故贬汝之真灵,转生东土。'
        ),
        Document(
            page_content=' 西游记 -124:”这猴亦止朝上唱个喏,道声谢恩。玉帝即命工干官张、鲁二班,在蟠桃园右首起一座齐天大圣府,府内设个二司:一名安静司,一
名宁神司。司俱有仙吏,左右扶持。又差五斗星君送悟空去到任,外赐御酒二瓶,金花十朵,着他安心定志,再勿胡为。那猴王信
受奉行,即日与五斗星君到府,打开酒瓶,同众尽饮。送星官回转本宫,他才遂心满意,喜地欢天,在于天宫快乐,无挂无碍。正
是:\n\n 仙名永注长生箓,不堕轮回万古传。\n\n 毕竟不知向后如何,且听下回分解。\n\n 第五回 乱蟠桃大圣偷丹 
反天宫诸神捉怪 \n\n 话表齐天大圣到底是个妖猴,更不知官衔品从,也不较俸禄高低,但只注名便了。那齐天府下二司仙吏,早晚
伏侍,只知日食三餐,夜眠一榻,无事牵萦,自由自在。闲时节会友游宫,交朋结义。见三清称个“老”字,逢四帝道个“陛下”。'
        )
    ],
    'question': '孙悟空取经后被封为什么职位?',
    'text': '孙悟空取经后被封为“斗战胜佛”。'
}

参考

[1] Langchain+RAG+ChatGLM3 量化推理

[2] bge_huggingface

[3] TypeError when chaining Runnables in LangChain: Expected a Runnable, callable or dict

[4] 5-basic-of-large-language-model

ks: chatglm3 quant4bit and rag

正文完
 
admin
版权声明:本站原创文章,由 admin 2024-01-13发表,共计11930字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请联系tensortimes@gmail.com。
评论(4条评论)
验证码
Jianxin
2024-01-25 16:45:15 回复

遇到这个错误,The model ‘ChatGLMForConditionalGeneration’ is not supported for text-generation. 是不是Python的包不正确啊?还能分享一下transformers/langchain的版本啊?

 Macintosh  Safari  中国江苏省南京市移动
    2024-01-26 12:34:39 回复

    transformers==4.36.2
    llama-index==0.9.29
    langchain==0.1.4
    langchain-community==0.0.16
    langchain-core==0.1.16
    openai==1.10.0
    bitsandbytes==0.42.0

     Windows  Chrome  美国加利福尼亚
ac
2024-04-01 16:49:30 回复

还是会报这个错误:The model ‘ChatGLMForConditionalGeneration’ is not supported for text-generation.把所有版本都试了,是不是chatglm3不支持text-generation啊?

 Windows  Chrome  中国江苏省南京市电信
    2024-04-01 20:56:50 回复

    chatglm_llm = HuggingFacePipeline(pipeline=text_generation_pipeline)
    这个句查一下langchain看能不能改掉,我记得当时huggingface在去年的版本是可以的。
    也可以说再试试降低版本。

     Windows  Chrome  美国加利福尼亚