构建LangChain应用程序的示例代码:27、FLARE:前瞻性主动检索增强生成技术实现与应用的示例

本文主要是介绍构建LangChain应用程序的示例代码:27、FLARE:前瞻性主动检索增强生成技术实现与应用的示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

FLARE:前瞻性主动检索增强生成

这个示例是前瞻性主动检索增强生成(FLARE)的实现。

请查看原始仓库。

基本思想是:

  • 开始回答问题
  • 如果开始生成模型不确定的标记,查找相关文档
  • 使用这些文档继续生成
  • 重复直到完成

在查找相关文档的方式上有很多有趣的细节。
基本上,模型不确定的标记会被突出显示,然后调用一个大型语言模型(LLM)生成一个会导致该答案的问题。例如,如果生成的文本是“Joe Biden went to Harvard”,模型不确定的标记是“Harvard”,那么一个生成的好问题可能是“Joe Biden 上的哪所大学?”。然后,这个生成的问题用于检索步骤来获取相关文档。

为了设置这个链,我们需要三件事:

  • 一个用于生成答案的 LLM
  • 一个用于生成用于检索的假设问题的 LLM
  • 一个用于查找答案的检索器

我们用来生成答案的 LLM 需要返回 logprobs,这样我们才能识别不确定的标记。因此,我们强烈推荐你使用 OpenAI 包装器(注意:不是 ChatOpenAI 包装器,因为它不返回 logprobs)。

我们用来生成用于检索的假设问题的 LLM 可以是任何东西。在这个示例中,我们将使用 ChatOpenAI,因为它快速且便宜。

检索器可以是任何东西。在这个示例中,我们将使用 SERPER 搜索引擎,因为它便宜。

其他需要理解的重要参数:

  • max_generation_len: 在停止检查是否有任何不确定之前生成的最大标记数
  • min_prob: 生成概率低于此的任何标记将被视为不确定

导入

import os# 设置 SERPER 和 OPENAI 的 API 密钥
os.environ["SERPER_API_KEY"] = ""
os.environ["OPENAI_API_KEY"] = ""
from typing import Any, Listfrom langchain.callbacks.manager import (AsyncCallbackManagerForRetrieverRun,CallbackManagerForRetrieverRun,
)
from langchain_community.utilities import GoogleSerperAPIWrapper
from langchain_core.documents import Document
from langchain_core.retrievers import BaseRetriever
from langchain_openai import ChatOpenAI, OpenAI

检索器

class SerperSearchRetriever(BaseRetriever):# Google Serper API 包装器search: GoogleSerperAPIWrapper = None# 创建检索器实例
retriever = SerperSearchRetriever(search=GoogleSerperAPIWrapper())

FLARE 链

# 我们这样设置,以便可以看到确切发生了什么
from langchain.globals import set_verbose# 开启详细模式
set_verbose(True)
from langchain.chains import FlareChain# 创建 FLARE 链实例
flare = FlareChain.from_llm(# 使用 ChatOpenAI 生成答案ChatOpenAI(temperature=0),# 设置检索器retriever=retriever,# 设置最大生成长度max_generation_len=164,# 设置最小概率值min_prob=0.3,
)
# 运行 FLARE 链,回答问题
query = "explain in great detail the difference between the langchain framework and baby agi"
flare.run(query)

’ LangChain is a framework for developing applications powered by language models. It provides a standard interface for chains, lots of integrations with other tools, and end-to-end chains for common applications. On the other hand, Baby AGI is an AI system that is exploring and demonstrating the potential of large language models, such as GPT, and how it can autonomously perform tasks. Baby AGI has the ability to complete tasks, generate new tasks based on previous results, and prioritize tasks in real-time. ’

# 使用 OpenAI 直接回答问题
llm = OpenAI()
llm.invoke(query)

‘\n\nThe Langchain framework and Baby AGI are both artificial intelligence (AI) frameworks that are used to create intelligent agents. The Langchain framework is a supervised learning system that is based on the concept of “language chains”. It uses a set of rules to map natural language inputs to specific outputs. It is a general-purpose AI framework and can be used to build applications such as natural language processing (NLP), chatbots, and more.\n\nBaby AGI, on the other hand, is an unsupervised learning system that uses neural networks and reinforcement learning to learn from its environment. It is used to create intelligent agents that can adapt to changing environments. It is a more advanced AI system and can be used to build more complex applications such as game playing, robotic vision, and more.\n\nThe main difference between the two is that the Langchain framework uses supervised learning while Baby AGI uses unsupervised learning. The Langchain framework is a general-purpose AI framework that can be used for various applications, while Baby AGI is a more advanced AI system that can be used to create more complex applications.’

# 运行 FLARE 链,回答另一个问题
query = "how are the origin stories of langchain and bitcoin similar or different?"
flare.run(query)

’ The origin stories of LangChain and Bitcoin are quite different. Bitcoin was created in 2009 by an unknown person using the alias Satoshi Nakamoto. LangChain was created in late October 2022 by Harrison Chase. Bitcoin is a decentralized cryptocurrency, while LangChain is a framework built around LLMs. ’


总结与扩展知识

FLARE 是一种结合了前瞻性主动检索和生成的技术,它通过在生成过程中检索相关信息来增强语言模型的生成能力。FLARE 的核心思想是在生成过程中,当模型对某些标记不确定时,通过检索相关文档来辅助生成更准确的答案。

在这个实现中,我们使用了以下技术和组件:

  1. 大型语言模型(LLM):用于生成答案和假设问题。这里推荐使用 OpenAI 的 API,因为它可以返回 logprobs,帮助我们识别模型不确定的标记。

  2. 检索器(Retriever):用于查找与生成问题相关的文档。在这个示例中,使用了 SERPER 搜索引擎,因为它成本较低。

  3. FlareChain:这是 LangChain 框架中的一个组件,用于构建和运行 FLARE 链。

  4. GoogleSerperAPIWrapper:一个包装器,用于简化与 Google SERPER 搜索引擎的交互。

  5. 环境变量:用于存储 API 密钥,保护敏感信息。

  6. LangChain 框架:一个用于构建和运行复杂语言模型链的框架,提供了一系列的工具和接口。

  7. 参数调整max_generation_lenmin_prob 是两个重要的参数,用于控制生成过程和不确定性标记的识别。

通过这些技术和组件的结合,FLARE 能够提供一种更加智能和准确的文本生成和检索方法,适用于需要高度定制化和准确性的问答系统。

这篇关于构建LangChain应用程序的示例代码:27、FLARE:前瞻性主动检索增强生成技术实现与应用的示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047560

相关文章

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

MyBatis-Plus逻辑删除实现过程

《MyBatis-Plus逻辑删除实现过程》本文介绍了MyBatis-Plus如何实现逻辑删除功能,包括自动填充字段、配置与实现步骤、常见应用场景,并展示了如何使用remove方法进行逻辑删除,逻辑删... 目录1. 逻辑删除的必要性编程1.1 逻辑删除的定义1.2 逻辑删php除的优点1.3 适用场景2.

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文