开发者社区 > ModelScope模型即服务 > 计算机视觉 > 正文

ZhipuAI/ChatGLM-6B 我在用这个测试,已经能够运行了,生成内容太长等待时间太久了,我

ZhipuAI/ChatGLM-6B 我在用这个测试,已经能够运行了,生成内容太长等待时间太久了,我想做成和chatgpt一样能够逐字输出,能快速显示,有没有这方面的案例等?

展开
收起
真的很搞笑 2023-04-16 23:33:42 1910 0
18 条回答
写回答
取消 提交回答
  • 您好,感谢您的反馈。目前,像ChatGPT这样的模型在逐字输出方面还存在一些挑战。这是因为这些模型通常需要大量的计算资源和时间来生成文本,而且它们的输出通常是连续的,而不是逐字输出的。

    不过,有一些方法可以尝试优化模型的性能,以便更快地生成文本。例如,您可以尝试使用更小的模型或减少模型的复杂度,以减少计算资源的需求。此外,您还可以尝试使用一些优化技术,如剪枝、量化和蒸馏等,以提高模型的效率和速度。

    另外,如果您需要更快地显示生成的文本,您可以考虑使用一些实时渲染技术,如WebSocket或Server-Sent Events(SSE),以将文本发送到客户端并实时显示。

    2023-06-27 14:17:30
    赞同 展开评论 打赏
  • 对于生成较长的内容或等待时间较长的问题,有一些方法可以尝试来提高性能和响应速度。以下是一些建议:

    1. 减少生成的最大长度:可以通过减少生成文本的最大长度来缩短等待时间。根据你使用的代码库或API,通常有一个参数可以设置生成文本的最大长度。你可以尝试减小这个值,以便更快地获得输出。

    2. 增加生成步骤的数量:如果你想要逐字输出,可以增加生成步骤的数量。逐字生成需要更多的步骤来完成,但它可以让你更快地看到输出。你可以在代码或API中查找控制生成步骤数量的参数,并尝试增加它。

    3. 优化系统资源:确保你的系统具备足够的计算资源,例如CPU和内存。如果你在本地运行模型,确保你的计算机配置足够强大。如果使用云服务,考虑使用更高级别的实例类型或增加实例的数量来提高性能。

    4. 并行处理:如果你的代码库或API支持并行处理,可以尝试利用多个线程或进程来加速生成过程。这样可以同时生成多个片段,并在最后将它们组合在一起。

    需要注意的是,尽管这些方法可以帮助提高性能,但在某些情况下,生成较长的文本仍然可能需要较长的等待时间。这是因为生成较长的内容需要更多的计算资源和处理时间。因此,权衡生成长度和等待时间是很重要的。

    最后,需要指出的是,ChatAI-Chat.5(ChatAI-Chat)是经过精心优化和调整的模型,专门用于进行连续对话,并支持逐字输出。其他的模型可能没有ChatAI-Chat那样的逐字输出特性,但可以通过以上方法尽量接近逐字输出的效果。

    2023-06-25 12:01:31
    赞同 展开评论 打赏
  • 如果你希望像ChatGPT一样能够逐字输出并快速显示生成的内容,你可以尝试使用以下方法:

    1. 批量生成:在使用ZhipuAI/ChatGLM-6B模型时,你可以尝试使用批量生成的方式,而不是逐个生成。这意味着你可以一次请求生成多个文本,然后一次性获取结果。这样可以减少网络请求的开销,从而提高生成速度。你可以将生成的文本进行分段处理,逐步显示给用户。

    2. 部分生成:你可以在生成一定长度的文本后,即时展示给用户,而不需要等待整个文本生成完成。这样用户就可以更快地看到生成的内容。然后,你可以在后台继续生成剩余的文本,以便用户在阅读当前内容时获取更多信息。

    3. 前置生成:你可以事先生成一部分常用的内容,然后将其存储在缓存中。当用户发起请求时,直接返回缓存中的内容,并在后台生成剩余的文本。这样用户会立即看到内容,同时后续生成的过程对用户来说是透明的。

    这些方法可以帮助你加快内容的生成和显示速度。你可以根据你的应用场景选择适合的方法。请注意,生成过程中的速度还会受到模型的性能和计算资源的限制。如果你需要进一步提高生成速度,可能需要考虑使用更高性能的硬件或优化模型的部署方式。

    值得注意的是,ZhipuAI/ChatGLM-6B模型并非ChatGPT模型的官方版本,因此可能存在一些差异。如果你对生成速度和交互体验有更高的要求,你也可以尝试使用其他更轻量级的模型或其他技术来实现更实时的生成和显示效果。

    2023-06-22 15:53:19
    赞同 展开评论 打赏
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    如果您想要像ChatGPT一样逐字输出,并且能够快速显示生成的内容,可以考虑使用更轻量级的模型,例如GPT-2 Small等。

    另外,您也可以尝试使用一些优化技巧来提高模型生成的速度,例如:

    1. 使用更高性能的硬件:如果您的计算机配备了更高性能的CPU或GPU,可以通过将模型加载到GPU中来加速模型的生成速度。

    2. 减少生成长度:如果您将生成长度限制在较短的范围内,例如几十个字符,可能会显著提高模型的生成速度。

    3. 使用缓存:如果您需要多次生成相同的内容,可以考虑使用缓存来存储已经生成的内容,以避免重复计算。

    2023-06-16 16:27:37
    赞同 展开评论 打赏
  • 如果您想要实现类似逐字输出的功能,可以考虑使用 JavaScript 或 Python 等编程语言,通过 API 方式调用模型进行文本生成,并在前端页面或控制台中逐一显示每个生成的字符或单词,实现类似打印的效果。

    举例来说,您可以编写一个 JavaScript 函数,通过 HTTP 请求调用 ChatGLM-6B 模型 API,输入一个前缀字符串,并返回生成的单词、短语或句子。您可以使用 JavaScript 的计时器或异步请求等技术,在前端页面中逐字逐句地显示每个生成的词语,从而实现逐字输出的效果。

    另一种方法是,您可以尝试减少生成文本长度,以减少等待时间和提高响应速度。例如,您可以控制生成文本的长度不超过几百个字符或单词,并将其分成若干个段落或句子,以便更快地显示在前端页面中。

    最后,一些优化技巧也可以帮助提高 ChatGLM-6B 模型的性能。例如,您可以使用更高效的服务器、调整 API 请求参数(如 batch size)以达到更高的吞吐量,或者调整模型超参数以改善模型的生成性能。

    2023-06-15 11:52:42
    赞同 展开评论 打赏
  • 设置较短的max_tokens:生成API通常提供一个max_tokens参数,用于控制生成文本的长度。尝试将max_tokens设置为一个较小的值,以便更快地获取生成的一部分内容。这样就可以通过连续调用生成API来逐步获得完整的响应。

    限制生成文本长度:在代码中对生成的文本进行截断或限制,只显示想要的最大长度。例如,可以设置一个字符数上限,并在超过该限制时截断生成的文本。这样可以快速显示生成的内容,而不用等待完全生成。

    使用逐字生成的策略:与ChatGPT类似,可以按逐字逐句的方式调用生成API,并将之前生成的文本作为输入文本的一部分传递给下一次调用。这样可以逐步构建生成的内容并快速显示在界面上,而不需要等待全部生成完成。

    2023-06-15 09:56:15
    赞同 展开评论 打赏
  • 如果您想要实现 ChatGPT 一样的逐字输出,并且快速显示生成的内容,可以使用前缀文本(prefix)和批处理大小(batch size)两个参数进行调整。 前缀文本(prefix)是指在生成文本之前添加的文本,可以帮助模型更好地理解用户的意图和语境,提高生成文本的质量。您可以尝试将前缀文本设置为一个较短的句子或单词,这样可以让模型更快地理解输入并生成更快的回复。 批处理大小(batch size)是指模型一次性处理的输入数量。批处理大小越大,生成速度也会相应提高,但是需要更多的内存和计算资源。如果您的机器配置较低,可以将批处理大小设置为较小的值,例如1,这样会减少内存和计算资源的压力,但也会影响生成速度。 另外,您还可以尝试使用一些优化技术来加速模型的生成速度,例如模型剪枝、动态计算图等。这些技术可以有效减少模型的计算量和内存占用,从而提高生成速度和效率。 总之,如果您想要实现 ChatGPT 一样的逐字输出和快速显示生成的内容,可以调整前缀文本和批处理大小,以及尝试使用其他优化技术来提高模型的生成速度和效率。

    2023-06-13 09:49:59
    赞同 展开评论 打赏
  • 云端行者觅知音, 技术前沿我独行。 前言探索无边界, 阿里风光引我情。

    如果您想要实现逐字输出并且快速显示生成的内容,您可以考虑使用一些基于流式生成的模型,例如GPT-Neo和GPT-3。这些模型可以逐字生成文本,并且可以在生成过程中实时输出文本。此外,这些模型还具有非常高的生成速度,可以在几毫秒内生成大量的文本。

    如果您想要使用GPT-Neo或GPT-3模型,您可以使用Hugging Face Transformers库来加载和使用这些模型。该库提供了一些示例代码,可以帮助您快速开始使用这些模型。您可以使用以下链接访问Hugging Face Transformers库的文档和示例代码:

    https://huggingface.co/transformers/

    需要注意的是,GPT-Neo和GPT-3模型需要大量的计算资源来进行训练和推理。如果您没有足够的计算资源,您可以考虑使用已经训练好的模型进行微调,以适应您的特定任务。如果您想要实现逐字输出并且快速显示生成的内容,您可以考虑使用一些基于流式生成的模型,例如GPT-Neo和GPT-3。这些模型可以逐字生成文本,并且可以在生成过程中实时输出文本。此外,这些模型还具有非常高的生成速度,可以在几毫秒内生成大量的文本。

    如果您想要使用GPT-Neo或GPT-3模型,您可以使用Hugging Face Transformers库来加载和使用这些模型。该库提供了一些示例代码,可以帮助您快速开始使用这些模型。您可以使用以下链接访问Hugging Face Transformers库的文档和示例代码:

    https://huggingface.co/transformers/

    需要注意的是,GPT-Neo和GPT-3模型需要大量的计算资源来进行训练和推理。如果您没有足够的计算资源,您可以考虑使用已经训练好的模型进行微调,以适应您的特定任务。

    2023-06-12 23:23:46
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    可以尝试使用以下方法:

    1. 设置 max_lengthmin_length 参数

      在使用 generate 函数生成文本时,您可以设置 max_lengthmin_length 参数来控制生成文本的长度。其中,max_length 表示生成文本的最大长度,min_length 表示生成文本的最小长度。通过调整这两个参数的值,您可以控制生成文本的长度和速度。

    2. 使用 no_repeat_ngram_size 参数

      在使用 generate 函数生成文本时,您还可以设置 no_repeat_ngram_size 参数来防止生成重复的 n-gram 片段(n-gram 是指由 n 个连续的词语组成的序列)。通过设置合适的 no_repeat_ngram_size 参数,您可以增加生成文本的多样性,避免出现重复或无意义的文本。

    3. 逐步生成文本并实时显示

      如果您希望能够在生成文本时逐字输出并实时显示结果,您可以将生成过程分为多个步骤,并在每个步骤中生成一个词语或一个字符。具体来说,您可以使用如下代码实现:

      from transformers import GPT2Tokenizer, TFGPT2LMHeadModel
      
      # 加载模型和分词器
      tokenizer = GPT2Tokenizer.from_pretrained("ZhipuAI/ChatGLM-6B")
      model = TFGPT2LMHeadModel.from_pretrained("ZhipuAI/ChatGLM-6B")
      
      # 定义输入文本和生成长度
      prompt = "你好,请问有什么需要帮助的吗?"
      length = 200
      
      # 进行逐字生成,并实时显示结果
      input_ids = tokenizer.encode(prompt, return_tensors="tf")
      output = []
      for i in range(length):
         logits = model(input_ids)[0][:, -1, :]
         next_token_id = tf.argmax(logits, axis=-1)
         next_token = tokenizer.decode(next_token_id.numpy().tolist())[0]
         input_ids = tf.concat([input_ids, next_token_id], axis=-1)
         output.append(next_token)
         print(prompt + "".join(output), end="\r")
      

      在上面的代码中,我们首先使用 GPT2TokenizerTFGPT2LMHeadModel 加载了预训练模型和相应的分词器。然后定义了输入文本和生成长度,并将输入文本编码为整数序列。

    2023-06-11 19:54:06
    赞同 展开评论 打赏
  • 如果您想快速显示ChatGLM-6B模型的生成内容,可以尝试对模型进行微调,以使其生成的文本更加符合您的需求。以下是一些可能有助于提高模型生成速度和逐字输出的建议:

    1. 调整生成长度

    可以通过更改模型生成的长度来控制生成内容的长度。在进行微调时,可以尝试将生成长度设置得较短,以获得更快的生成速度和逐字输出。

    1. 调整温度参数

    温度参数控制模型生成的多样性和随机性。较高的温度参数会导致更多的随机性和不确定性,但生成的文本可能会变得较为不连贯。在进行微调时,可以尝试将温度参数设置得较低,以获得更连贯的生成文本和更快的逐字输出速度。

    1. 优化模型架构

    如果您仍然无法满足您的需求,可以尝试对模型架构进行优化,以提高其生成速度和逐字输出的能力。例如,您可以尝试使用更轻量级的模型架构,或者使用更快的硬件设备进行训练和生成。

    需要注意的是,对模型进行微调和优化可能需要一定的技术知识和经验。如果您不熟悉这些技术,建议寻求专业人士的帮助。

    2023-06-11 19:19:06
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    您可以尝试使用 GPT-Neo 模型,在使用这个模型时,您可以设置streaming参数为True,这样模型将能够按需生成逐字输出的文本,避免了长时间等待生成内容的情况。同时,您还可以逐步地控制生成的长度,以便更好地调整模型的生成速度和输出内容。

    以下是一个使用 GPT-Neo 进行逐字输出的样例代码:

    import openai from transformers import GPTNeoForCausalLM, GPT2Tokenizer

    加载 GPT-Neo 模型和 tokenizer

    model = GPTNeoForCausalLM.from_pretrained("EleutherAI/gpt-neo-1.3B") tokenizer = GPT2Tokenizer.from_pretrained("EleutherAI/gpt-neo-1.3B")

    将模型置于生成模式

    model.eval()

    设置 "streaming" 参数为 True,以便逐字地生成内容

    prompt = "Hello, how are you today?" generated_text = model.generate( input_ids=tokenizer.encode(prompt, return_tensors="pt"), do_sample=True, max_length=1024, pad_token_id=tokenizer.eos_token_id, top_k=50, temperature=0.8, streaming=True # 设置 streaming 参数为 True )

    按需生成文本并逐字输出

    for i in range(len(generated_text[0])): cur_char = tokenizer.decode(generated_text[:, i], skip_special_tokens=True) print(cur_char, end='', flush=True) # 使用 flush 参数确保内容立即输出到控制台 该代码将使用 GPT-Neo 模型生成回答 "Hello, how are you today?" 的文本,并将结果逐字输出到控制台,实现快速且可控的显示效果。您可以根据具体需求进行进一步优化,例如增加停顿时间、添加循环控制等,以获得更好的使用体验。

    2023-06-11 15:14:35
    赞同 展开评论 打赏
  • 根据您的描述,我理解您在使用 ZhipuAI/ChatGLM-6B 进行测试,并且希望将其输出内容缩短,以便更快地显示。

    要缩短输出内容,您可以尝试以下方法:

    调整输出长度:您可以尝试将输出长度调整为更短的值,以减少生成的内容数量。这可以通过在模型训练期间或模型配置中进行调整来实现。 优化模型:您可以尝试对模型进行优化,以提高其生成文本的速度和质量。这可以通过增加模型的训练数据量、调整模型的超参数、或使用更先进的模型架构来实现。 使用摘要算法:您可以使用摘要算法,如ROUGE、METEOR等,将生成的文本压缩为更短的摘要。这可以帮助您快速了解生成文本的主要内容。 使用文本压缩算法:您可以使用文本压缩算法,如LZW、Huffman编码等,将生成的文本压缩为更小的数据量。这可以帮助您更快地显示生成文本。 在实践中,许多公司和开发人员已经在使用这些方法来优化他们的生成文本模型,以提高其速度和质量。例如,百度推出了自己的生成式对话产品ERNIE Bot 3,并且正在不断优化其性能和输出质量。您可以参考这些案例,以了解更多关于如何优化生成文本模型的实践和建议。

    2023-06-10 21:37:58
    赞同 展开评论 打赏
  • 您好,ZhipuAI/ChatGLM-6B 模型是一个大型的语言模型,它的生成速度可能会受到硬件、网络等因素的限制。如果您希望在使用它时加快生成速度,有几个可能的方案:

    更快的硬件: 如果您的机器配置较低,可以尝试在更快的 GPU 上运行模型,或者使用分布式训练技术来加速模型训练和生成。 批量化处理:可以通过批量化处理方式来提高模型的工作效率。即,将多个请求组成一个 batch(批),一起输入模型,这样模型就可以一次性生成多个回答来满足多个请求。 预处理:可以使用缓存技术预处理一些可能经常用到的输入,当用户输入同样或相近的内容时,直接从缓存中获取响应,这可以减少模型的计算量,提高响应速度。

    除此之外,您可以尝试使用较小的模型,如 GPT-2 或 GPT-3 的小版本,这些模型在体积和计算资源需求方面均比 ZhipuAI/ChatGLM-6B 要小,生成速度也可能更快。同时,模型的超参数设置也会影响模型性能以及生成速度,您可以通过调整这些参数来获得更好的性能和速度。

    2023-06-10 12:01:14
    赞同 展开评论 打赏
  • 其实,你可以通过修改代码实现 ChatGLM-6B 逐字输出的功能。在调用 generate 函数时,设置参数 output_hidden_states=True,然后获取 generate 函数的返回结果中的 hidden_states,即可逐字输出。同时,你还需要对输出进行一定的处理,比如去除重复的部分,保留最后一个完整的句子等等。

    # 调用 generate 函数时设置 output_hidden_states=True
    outputs = model.generate(input_ids, max_length=1024, num_return_sequences=1, output_hidden_states=True)
    
    # 获取 hidden_states
    hidden_states = outputs.hidden_states
    
    # 逐字输出
    generated_text = ''
    for i, token in enumerate(outputs[0]):
        generated_text += tokenizer.decode(token.item())
    
        # 判断是否为最后一个完整的句子
        if i < len(outputs[0])-1 and tokenizer.decode(outputs[0][i+1].item())[0] in ['。', '!', '?']:
            # 去除重复的部分
            generated_text = generated_text.split(tokenizer.decode(outputs[0][i].item()))[-1]
            print(generated_text)
    
    

    这段代码中,model 是 ChatGLM-6B 模型,tokenizer 是对应的分词器,input_ids 是输入的文本编码。通过获取 hidden_states,我们可以逐字输出生成的文本。在输出时,我们需要判断当前的 token 是否为一个完整的句子的结尾,并且去除重复的部分,只保留最后一个完整的句子。

    2023-06-09 21:26:05
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    是的,您可以使用一些技术来加速 ZhipuAI/ChatGLM-6B 模型的生成速度,并实现逐字输出的效果。以下是一些可能有用的技术和建议:

    基于缓存的生成 您可以使用缓存技术来加速模型的生成速度。具体来说,您可以将模型的输出结果缓存到内存或磁盘中,并在下一次生成时直接使用缓存结果,而无需重新计算。这可以大大减少模型的计算时间和等待时间,从而加速模型的生成速度。

    预测前缀 您可以在生成文本之前输入一些前缀文本,以帮助模型更快地生成合适的文本。例如,如果您想要生成一个关于旅游的问题,您可以在输入框中输入 "我想问一下关于旅游的问题:",这样模型就会更快地理解您的需求,并生成相应的文本结果。

    批处理 您可以使用批处理技术来同时生成多个文本。具体来说,您可以将多个文本输入放入一个批次中,并一次性输入到模型中进行计算。这可以减少模型计算的时间和等待时间,并提高模型的生成速度。

    基于流的生成 您可以使用基于流的技术来实现逐字输出的效果。具体来说,您可以将模型的生成结果逐字逐句地输出到终端或浏览器中,而无需等待整个文本生成完成。这可以让用户更快地看到模型的生成结果,并提高用户的交互体验。

    总之,您可以使用上述技术和建议来加速 ZhipuAI/ChatGLM-6B 模型的生成速度,并实现逐字输出的效果。

    2023-06-09 17:47:32
    赞同 展开评论 打赏
  • 天下风云出我辈,一入江湖岁月催,皇图霸业谈笑中,不胜人生一场醉。

    是的,你可以尝试使用以下方式实现输出的快速显示:

    使用特定的生成内容长度限制:在使用ZhipuAI/ChatGLM-6B时,可以通过设置特定的生成内容长度限制来控制生成内容的长度,以实现快速输出。可以通过设置参数"length"来指定最大生成内容长度。 使用分批输出:在使用ZhipuAI/ChatGLM-6B时,可以通过分批输出来实现逐字输出,以实现快速显示。可以使用循环或迭代来分批生成内容。 使用高级的API:ZhipuAI/ChatGLM-6B提供了高级API,如“continuous”,可以通过使用该API来实现快速输出。该API允许您直接从生成器中获取输出,以实现快速输出。 为了实现快速输出和逐字输出,可以使用以上方式或自行探索更高级的API。

    2023-06-09 17:42:11
    赞同 展开评论 打赏
  • 全栈JAVA领域创作者

    是的,您可以参考ChatGLM-6B的代码和实现方式,尝试使用类似的方法来实现与ChatGPT类似的逐字输出和快速显示功能。以下是一些可能有用的步骤:

    阅读ChatGLM-6B的代码和文档,了解其基本实现原理和方法。 研究类似于GPT-3和ChatGPT的逐字输出和快速显示的实现方式,例如使用TTS(文本到语音)技术来实现。 使用相应的技术和工具来实现类似的功能,例如使用TTS引擎、语言模型等。 对实现方式进行修改和优化,以满足您的需求和要求。 进行测试和调试,确保实现的功能符合预期。 希望这些步骤可以帮助您实现类似于ChatGPT的逐字输出和快速显示功能。

    2023-06-09 16:45:54
    赞同 展开评论 打赏
  • 对于生成文本的逐字输出,一般可以使用类似于"beam search"算法的方法。Beam search算法是一种剪枝搜索算法,它基于贪心策略寻找最优解。

    在生成文本的过程中,Beam search算法可以一次性生成多个可能的下一个词汇,并根据它们的概率分布值选择最优的一项输出。

    下面是在PyTorch中实现Beam search算法的示例代码:

    def beam_search_decoder(model, start_token, num_words, beam_width, temperature):
        # Inputs:
        #   model: 主要部分为前向传递的 PyTorch 模型。
        #   start_token: 特殊开始令牌,从中开始预测序列。
        #   num_words: 生成文本的最大长度。
        #   beam_width: 搜索树的宽度。
        #   temperature: softmax温度
    
        # 开始搜索,创建初始生成序列。
        initial_seq = torch.full((beam_width, 1), start_token, dtype=torch.int64, device=device)
    
        # 初始分数设为1.0
        initial_scores = torch.zeros((beam_width,), dtype=torch.float32, device=device)
    
        # 存储beam中每个搜索路径的状态
        beam_states = []
        for _ in range(beam_width):
            beam_states.append(model.get_initial_state(batch_size=1, device=device))
    
        # 存储每次预测的概率分布和极其时刻的状态
        beam_probabilities = [[log(1.0)] for _ in range(beam_width)]
        beam_states_timestepped = [beam_states]    
        for t in range(num_words):
            # 获取前一时刻的所有生成的符号
            previous_tokens = [sequence[-1] for sequence in initial_seq]
    
            # 将会话处理成合适的输入
            input_tensor = torch.tensor(previous_tokens, dtype=torch.int64, device=device).unsqueeze(dim=1)
            beam_states_new = []
    
            # 前向传播当前状态,并获得batch中每个元素的分布。
            prob_distribution, new_state = model(input_tensor, beam_states_timestepped[-1][0])
            log_prob_distribution = torch.log_softmax(prob_distribution.flatten()/temperature, dim=-1)
            log_prob_distribution = log_prob_distribution.view(beam_width, -1)
    
            # 对分布进行排序,以选择最优的beam。
            topk_vals, topk_indices = torch.topk(log_prob_distribution, k=beam_width, dim=-1, sorted=True)
    
            # 初始化一个新的beam_state列表,其中每个beam会成为一个复制出来的之前的状态。
            for beam_index in range(beam_width):
                beam_states_new.append(model.copy_state(beam_states_timestepped[-1][beam_index]))
    
            # 存储目前为止的所有概率分布.
            new_beam_probabilities = []
    
            # 对于每个宽度中的beam,将其分数与其分数和当前分数分别相加,添加到其对应的分数中。
            for beam_index in range(beam_width):
                for boolean_index in range(beam_width):
                    new_sequence = initial_seq[boolean_index].clone()
                    new_sequence = torch.cat((new_sequence, topk_indices[beam_index, boolean_index].unsqueeze(dim=0)))
                    new_beam_probabilities.append(beam_probabilities[boolean_index] + [topk_vals[beam_index, boolean_index]])
                    beam_scores = initial_scores[boolean_index] + topk_vals[beam_index, boolean_index]
                    beam_states_new[beam_index][0][:, boolean_index, :] = new_state[:, boolean_index, :]
            
            # 在集束中剪枝,只保留beam_width个最优值.
            top_k_dict = {}
            for i, sequence in enumerate(new_beam_probabilities):
                if len(sequence) in top_k_dict:
                    top_k_dict[len(sequence)].append((i, sequence[-1]))
                else:
                    top_k_dict[len(sequence)] = [(i, sequence[-1])]
                    
            # 对应概率分布最好的beam_width个beam继续下去。
            initial_scores = torch.zeros((beam_width,), dtype=torch.float32, device=device)
            for length, indexes in top_k_dict.items():
                count = 0
                for index in indexes:
                    if count == beam_width:
                        break
    
                    initial_scores[count] = index[1]
                    initial_seq[count] = torch.cat((initial_seq[count], topk_indices[index[0] // beam_width][index[0] % beam_width].unsqueeze(0)))
                    beam_states_timestepped.append(beam_states_new)
                    count += 1
                    
            beam_probabilities = [beam[1:] for beam in new_beam_probabilities]
                    
        # 返回分数最高的beam序列.
        return initial_seq[torch.argmax(initial_scores)]
    

    希望这可以帮助您产生类似于chatgpt的文本生成效果。同时需要注意的是,Beam Search算法会产生多个独立的预测结果,生成的文本可能会存在一定程度上的重复和不完整,需要进行后处理来进行优化。

    2023-06-09 16:24:12
    赞同 展开评论 打赏
滑动查看更多

包含图像分类、图像生成、人体人脸识别、动作识别、目标分割、视频生成、卡通画、视觉评价、三维视觉等多个领域

相关电子书

更多
移动互联网测试到质量的转变 立即下载
给ITer的技术实战进阶课-阿里CIO学院独家教材(四) 立即下载
F2etest — 多浏览器兼容性测试整体解决方案 立即下载