LangChain 支持的工具一览
使用代码 from langchain.agents import load_tools
tool_names = [...]
llm = ...
tools = load_tools(tool_names, llm=llm)
LangChain 中的工具箱一览
- 集成多模型和多策略: LangChain 提供了一种方法,使得多个模型或策略能够在一个统一的框架下工作。例如,arXiv 是一个单独的工具,它负责处理特定的任务。这种工具可以与其他工具(例如用于处理自然语言查询或者数据库查询的工具)一起作为一个集成的系统存在。这样,你可以轻松地创建一个系统,该系统可以处理多种类型的输入并执行多种任务,而不必为每个任务单独写代码。
- 更易于交互和维护: 通过 LangChain,你可以更方便地管理和维护你的工具和模型。LangChain 提供的工具和代理(Agent)抽象使得开发者可以将关注点从底层实现细节转向实现应用的高层逻辑。而且,LangChain封装了像模型的加载、输入输出的处理、工具的调度等底层任务,使得开发者能够更专注于如何组合这些工具以解决实际问题。
- 适应性: LangChain 提供的架构允许你轻松地添加新的工具或模型,或者替换现有的工具或模型。这种灵活性使得你的系统可以很容易地适应新的需求或改变。
- 可解释性: LangChain 还提供了对模型决策的可解释性。在你的示例中,LangChain 提供的对话历史和工具选择的记录可以帮助理解系统做出某些决策的原因。
总的来说,尽管直接调用模型可能对于单一任务或简单应用来说足够了,但是当你需要处理更复杂的场景,例如需要协调多个模型或工具,或者需要处理多种类型的输入时,使用像 LangChain 这样的框架可以大大简化你的工作。
(二)RAG(检索增强生成)概述
- 定义:RAG结合了检索和生成的能力,为文本序列生成任务引入外部知识。
- 目的:增强模型的生成能力,使其能够产生更丰富、准确和有根据的内容。
RAG的工作原理
- 检索:从大型文档集合中检索与输入相关的文档或段落。
- 上下文编码:将检索到的文档与原始输入一起编码。
- 生成:使用编码的上下文信息生成输出。
RAG的关键特点
- 外部知识:不仅仅依赖于训练数据中的信息,还可以从大型外部知识库中检索信息。
- 适用场景:特别适合处理在训练数据中未出现的问题。
LangChain中的RAG应用
- 文档加载:LangChain提供多种类型的文档加载器,加载各种类型的文档,并与Airbyte和Unstructured.IO等集成。
- 文本转换:将长文档分割成更小的块,以适合模型的上下文窗口。
- 文本嵌入:使用LLM将文本转换为数值表示,便于计算机处理和比较文本。
- 存储嵌入:将计算出的嵌入存储或临时缓存,以加速过程。
- 向量数据库:存储嵌入向量,执行向量搜索。
- 数据检索:通过检索器返回相关的文档。
文本分割器
- 目的:将长文本分割成块,影响检索结果质量。
- 考虑因素:LLM的上下文窗口限制、任务类型、文本性质。
其他形式的文本转换
- 过滤冗余文档:识别相似文档并过滤掉冗余信息。
- 翻译文档:将文档从一种语言翻译成另一种语言。
- 提取元数据:从文档内容中提取关键信息。
- 转换对话格式:将对话式内容转化为问答格式。
嵌入和存储
- 嵌入类:与文本嵌入模型交互,提供标准接口。
- 缓存存储:支持缓存嵌入,减少计算资源消耗。
在内存中缓存嵌入的示例代码如下:
#导入内存存储库,该库允许我们在RAM中临时存储数据 from langchain.storage import InMemoryStore
#创建一个InMemoryStore的实例 store = InMemoryStore()
#导入与嵌入相关的库。OpenAIEmbeddings是用于生成嵌入的工具,而CacheBackedEmbeddings允许我们缓存这些嵌入 from langchain.embeddings import OpenAIEmbeddings, CacheBackedEmbeddings
#创建一个OpenAIEmbeddings的实例,这将用于实际计算文档的嵌入 underlying_embeddings = OpenAIEmbeddings()
#创建一个CacheBackedEmbeddings的实例。 #这将为underlying_embeddings提供缓存功能,嵌入会被存储在上面创建的InMemoryStore中。 #我们还为缓存指定了一个命名空间,以确保不同的嵌入模型之间不会出现冲突。 embedder = CacheBackedEmbeddings.from_bytes_store( underlying_embeddings, # 实际生成嵌入的工具 store, # 嵌入的缓存位置 namespace=underlying_embeddings.model # 嵌入缓存的命名空间 )
#使用embedder为两段文本生成嵌入。 #结果,即嵌入向量,将被存储在上面定义的内存存储中。 embeddings = embedder.embed_documents(["你好", "智能鲜花客服"])
- 向量数据库:存储嵌入数据,执行向量搜索。
检索器
- 向量存储检索器:支持向量检索,是最常见的检索器类型。
- 其他检索器:LangChain提供多种其他检索工具。
索引
- 目的:高效地管理和定位文档信息。
- 记录管理器:跟踪哪些文档已经被写入向量存储。
总结
- RAG为非结构化数据创建了一个“地图”,快速准确地检索信息。
- 在鲜花运营场景中,RAG可以关联鲜花与非结构化信息,提供实时的订单更新、跟踪和查询服务。
思考题
- 使用一种文本分割器来给文档分块。
- 使用一种新的向量数据库来存储文本嵌入。
- 使用一种新的检索器来提取信息。