链思考题 | 豆包MarsCode AI刷题

35 阅读5分钟

这段代码主要是对之前课程中涉及的一段代码进行重构,目的是利用LLMChain的功能特性来简化代码结构,使其更加简洁和可读。原来的代码是分步进行提示格式化、模型调用以及输出解析等操作,而重构后将这些操作整合到了LLMChain中统一处理。

llm_chain = LLMChain(
        llm=model,
        prompt=prompt,
        output_parser=output_parser)

这里创建了一个LLMChain对象,传入了三个关键参数: - llm:指定了要使用的语言模型实例,这里假设model是已经正确初始化好的语言模型对象(例如基于OpenAI的某个模型实例等),它负责根据输入生成相应的文本输出。 - prompt:是一个提示模板对象,定义了输入给语言模型的文本格式以及包含的变量等信息,用于按照特定规则准备输入给模型的内容。 - output_parser:用于对语言模型的输出结果进行解析,将原始输出转换为更符合期望格式或者便于后续使用的数据结构。通过把这三个部分传入LLMChain构造函数,就将原本分散的操作整合到了一起,后续使用这个链对象就能方便地完成整个流程。

  • 循环处理数据并获取结果
for flower, price in zip(flowers, prices):
    result = llm_chain({"flower_name": flower, "price": price})
    print(result)
- 这里通过循环遍历`flowers``prices`两个可迭代对象(可能分别存储了花的名称和对应的价格信息等数据),每次循环获取一组对应的`flower`(花名)和`price`(价格)值。
- 然后构造一个字典`{"flower_name": flower, "price": price}`作为输入传递给`llm_chain`对象,调用`llm_chain`的过程中,它内部会自动根据传入的`prompt`模板对输入进行格式化(例如将`flower_name``price`的值填充到模板相应位置),接着把格式化后的内容传递给关联的语言模型进行处理,得到模型输出后,再使用传入的`output_parser`对输出进行解析,最终返回解析后的结果赋值给`result`变量。最后直接打印`result`,就能看到经过整合处理后的输出内容,无需像原来那样在代码中分别进行格式化、调用模型以及解析结果等多个分散的操作了,大大简化了代码逻辑。

二、使用MapReduceChain处理文本数据部分

使用MapReduceChain来处理一批文本数据。整体思路是先将文本数据进行分割,然后利用MapReduceChain的特性,在“Map”阶段对每个分割后的文本片段独立提取关键信息,在“Reduce”阶段汇总整合这些关键信息,从而实现对批量文本数据的一种特定处理流程,以达到提取和整合关键内容的目的。

  • 准备文本数据和进行文本分割
texts = ["这是第一段文本内容", "这是第二段文本内容", "这是第三段文本内容"]
text_splitter = CharacterTextSplitter()
split_texts = text_splitter.split_documents(texts)
- 首先定义了一个`texts`列表,其中包含了多条文本数据示例,模拟了实际中一批需要处理的文本内容。
- 接着创建了`CharacterTextSplitter`对象,它可以按照特定的字符规则(比如按字符长度、特定分隔符等,默认有其内置规则)对文本进行分割,调用`split_documents`方法将`texts`中的文本进行分割处理,得到分割后的文本片段列表`split_texts`,这样后续就能对每个片段进行单独处理了。
  • 创建语言模型实例和MapReduceChain对象
llm = OpenAI(temperature=0)
map_template = "请提取以下文本的关键信息: {text}"
map_prompt_template = PromptTemplate(input_variables=["text"], template=map_template)
reduce_template = "汇总以下关键信息: {texts}"
reduce_prompt_template = PromptTemplate(input_variables=["texts"], template=reduce_template)
map_reduce_chain = MapReduceChain(
    llm=llm,
    map_prompt=map_prompt_template,
    reduce_prompt=reduce_prompt_template
)
- 首先创建了`OpenAI`语言模型实例`llm`,设置了`temperature=0`,这通常意味着模型生成结果会更偏向确定性、逻辑性较强的输出(温度参数控制生成的随机性和创造性程度)。
- 然后定义了“Map”阶段的提示模板,`map_template`字符串指定了要让模型做的任务是提取传入文本的关键信息,通过`PromptTemplate`将其包装成模板对象`map_prompt_template`,这个模板接收一个名为`text`的变量,后续会将每个分割后的文本片段传入此处。
- 同样地,定义了“Reduce”阶段的提示模板`reduce_template`,任务是汇总传入的关键信息,包装成`reduce_prompt_template`对象,接收名为`texts`的变量,用于传入多个关键信息文本进行汇总。
- 最后创建`MapReduceChain`对象,传入创建好的语言模型实例`llm`以及“Map”和“Reduce”阶段的提示模板对象,这样就配置好了整个MapReduce处理流程所需要的关键元素。
  • 运行MapReduceChain处理文本数据并输出结果
result = map_reduce_chain(split_texts)
print(result)

将分割后的文本片段列表split_texts作为输入传递给map_reduce_chain对象,它会按照内部设定的流程,先在“Map”阶段对每个文本片段依据map_prompt_template提示模板调用语言模型提取关键信息,然后在“Reduce”阶段依据reduce_prompt_template提示模板将提取到的关键信息汇总整合,最终返回汇总后的结果赋值给result变量,并通过print(result)将处理后的结果输出展示,这样就完成了利用MapReduceChain对一批文本数据进行关键信息提取和汇总的整个过程。