Haystack 的开源开发 LLM 应用设计框架

  每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行! 订阅:https://rengongzhineng.io/

在人工智能的世界中,开发者有许多工具和技术可以用来创建基于大型语言模型(LLM)的应用程序。而最近,一款名为 Haystack 的开源框架正在崭露头角,成为构建 AI 应用的强大工具。本文将详细解读 Haystack 的独特优势,并探讨其在 LLM 生态系统中的竞争力。最后,我们将通过一个 RAG(检索增强生成)案例来展示其实际应用。 Haystack | Haystack

什么是 Haystack?

Haystack 是一款专为开发 LLM 应用设计的工具包,它特别适用于处理大量文本或文档的场景。Haystack 的特点是代码量少、易于上手,可以快速搭建生产级别的 LLM 应用。正如其名字暗示,Haystack 就像一组可以自由组合的积木,用于创建各种类型的 AI 系统。

以下是一些 Haystack 可实现的功能:

  • 构建基于海量文档的问答型聊天机器人
  • 开发能够从多个文档中提取特定信息的系统
  • 创建可以理解并处理文本、图像等多种数据类型的应用程序

在 Python 3.10 环境中,只需一行代码即可安装:

pip install haystack-ai

Haystack 的核心工作原理

Haystack 的运作基于两个核心概念:

  1. 组件(Components)
    每个组件负责特定的任务。例如,一个组件可能用于检索相关文档,另一个组件则生成文本回答。
  2. 管道(Pipelines)
    管道负责连接这些组件,定义组件间的工作顺序以及数据流动的方式。

通过灵活组合不同的组件,开发者可以创建能够执行复杂任务的 AI 系统。

Haystack 的主要特性

1. 灵活性

Haystack 支持多种 AI 模型(如 OpenAI、HuggingFace)和数据存储系统(如 ChromaDB、Pinecone,甚至是 Neo4j)。

2. 易用性

无需深入了解 AI 复杂细节,即可使用 Haystack 构建应用。

3. 高度可定制

支持通过 Pydantic 结构自定义新组件,满足特定需求。

4. 丰富的应用场景

适用于从问答系统到信息抽取等多种 AI 应用的开发。

用例展示:构建 RAG 管道

接下来,本文将通过一个检索增强生成(RAG)案例,带你动手实现 Haystack 的实战应用。

文档清理与处理管道

首先,为了处理 HTML 文档,我们需要安装以下依赖:

pip install trafilatura lxml_html_clean

导入必要的库文件:

import urllib.request
from haystack import Pipeline
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.retrievers import InMemoryEmbeddingRetriever
from haystack.components.converters import HTMLToDocument
from haystack.components.preprocessors import DocumentCleaner, DocumentSplitter
from haystack.components.embedders import OpenAIDocumentEmbedder
from haystack.components.writers import DocumentWriter

from dotenv import load_dotenv
load_dotenv()

将文档存储到内存中:

document_store = InMemoryDocumentStore()

创建一个 HTML 转换器以处理文档:

text_file_converter = HTMLToDocument()

文档清理组件会移除空行、多余空格等,优化文本的可读性:

cleaner = DocumentCleaner()

然后,使用分割器将长文档拆分为句子块,每块包含5句:

splitter = DocumentSplitter(split_by="sentence", split_length=5)

嵌入器(Embedder)将计算每个文档的嵌入向量:

embedder = OpenAIDocumentEmbedder()

最后,通过 DocumentWriter 将处理后的文档存储到内存中:

writer = DocumentWriter(document_store)

将这些组件连接成一个完整的管道:

indexing_pipeline = Pipeline()
indexing_pipeline.add_component("converter", text_file_converter)
indexing_pipeline.add_component("cleaner", cleaner)
indexing_pipeline.add_component("splitter", splitter)
indexing_pipeline.add_component("embedder", embedder)
indexing_pipeline.add_component("writer", writer)

indexing_pipeline.connect("converter.documents", "cleaner.documents")
indexing_pipeline.connect("cleaner.documents", "splitter.documents")
indexing_pipeline.connect("splitter.documents", "embedder.documents")
indexing_pipeline.connect("embedder.documents", "writer.documents")

运行管道并处理示例文档:

indexing_pipeline.run(data={"sources": ["free_as_in_freedom.html"]})

构建 RAG 管道

在 RAG 部分,我们将加载处理好的文档,并定义检索和生成组件:

retriever = InMemoryEmbeddingRetriever(document_store)

prompt_template = """Given these documents, answer the question.
Documents:
{% for doc in documents %}
{{ doc.content }}
{% endfor %}
Question: {{query}}
Answer:"""

prompt_builder = PromptBuilder(template=prompt_template)
llm = OpenAIGenerator()

同样,通过管道连接这些组件:

rag_pipeline = Pipeline()
rag_pipeline.add_component("retriever", retriever)
rag_pipeline.add_component("prompt_builder", prompt_builder)
rag_pipeline.add_component("llm", llm)

rag_pipeline.connect("retriever.documents", "prompt_builder.documents")
rag_pipeline.connect("prompt_builder", "llm")

最后,输入查询并获取答案:

query = "What is the profession of Richard M. Stallman and where does he work?"
result = rag_pipeline.run(data={"prompt_builder": {"query": query}})
print(result["llm"]["replies"][0])

输出结果

通过简单几步,Haystack 生成了如下答案:

Richard M. Stallman is a software programmer and works at the Massachusetts Institute of Technology's Artificial Intelligence Laboratory.

总结

Haystack 是一款极具潜力的开源工具,它让开发者能够高效地构建基于 LLM 的 AI 应用。从问答系统到信息抽取,Haystack 提供了灵活且强大的构建能力,帮助更多开发者轻松驾驭 AI 的复杂性。随着其功能不断完善,这一工具将在未来占据更重要的位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/921259.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 919.完全二叉树插入器

1.题目要求: 完全二叉树 是每一层(除最后一层外)都是完全填充(即,节点数达到最大)的,并且所有的节点都尽可能地集中在左侧。设计一种算法,将一个新节点插入到一棵完全二叉树中,并在…

提升性能测试效率与准确性:深入解析JMeter中的各类定时器

在软件性能测试领域,Apache JMeter是一款广泛使用的开源工具,它允许开发者模拟大量用户对应用程序进行并发访问,从而评估系统的性能和稳定性。在进行性能测试时,合理地设置请求之间的延迟时间对于模拟真实用户行为、避免服务器过载…

Python + 深度学习从 0 到 1(00 / 99)

希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持! ⭐ 什么是深度学习? 人工智能、机器学习与…

亚信安全发布《2024年第三季度网络安全威胁报告》

《亚信安全2024年第三季度网络安全威胁报告》的发布旨在从一个全面的视角解析当前的网络安全威胁环境。此报告通过详尽梳理和总结2024年第三季度的网络攻击威胁,目的是提供一个准确和直观的终端威胁感知。帮助用户更好地识别网络安全风险,并采取有效的防…

ROS机器视觉入门:从基础到人脸识别与目标检测

前言 从本文开始,我们将开始学习ROS机器视觉处理,刚开始先学习一部分外围的知识,为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本,系统采用Ubuntu20.04,ROS采用noetic。 颜…

利用c语言详细介绍下选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它是每次选出最小或者最大的元素放在开头或者结尾位置(采用升序的方式),最终完成列表排序的算法。 一、图文介绍 我们还是使用数组【10,5,3…

candence: 非金属化孔制作

非金属化孔制作 以下面这个RJ45接口为例 1、打开pad designer 只需要设置开始、结束层即可。 保存 来直观看下非金属化孔和金属化孔的区别:

用宏实现简单的计算器

大家好,那么经过我们前面几期的学习,我们对宏有了一定的了解,那么我们今天就来试试实现一个简单的加减乘除运算。 我们的思路是使用三目操作符来分别进行加减和乘除的运算,然后用if判断来”进入相关的判断体进而来进行计算。当然…

Postman之newman

系列文章目录 1.Postman之安装及汉化基本使用介绍 2.Postman之变量操作 3.Postman之数据提取 4.Postman之pm.test断言操作 5.Postman之newman Postman之newman 1.基础环境node安装1.1.配置环境变量1.2.安装newman和html报告组件 2.newman运行 newman可以理解为,没有…

用python简单集成一个分词工具

本部分记录如何利用Python进行分词工具集成,集成工具可以实现运行无环境要求,同时也更方便。 该文章主要是记录,知识点不是特别多,欢迎访问个人博客:https://blog.jiumoz.top/archives/fen-ci-gong-ju-ji-cheng 成品展…

CMake + mingw + opencv

由于是在windows下开发,因此下载的是windows版本的安装程序,如图: 下载的是 MSVC 编译的 OpenCV,但由于我一般使用的是JetBrains的开发工具,并且为了方便跨平台,我一般也是使用cmakemingw编译,这…

11.22 校内模拟赛总结

挂分场 复盘 决定尝试一下多放一点时间在前期看题上 T1 发现是模拟;T2 看上去好神秘啊!想了一会一直没什么思路;T3 看上去眼熟,但还是觉得计数很困难;T4 看完发现是数据结构,推了推很快会了树高做法&…

使用 PyTorch-BigGraph 构建和部署大规模图嵌入的完整教程

当涉及到图数据时,复杂性是不可避免的。无论是社交网络中的庞大互联关系、像 Freebase 这样的知识图谱,还是推荐引擎中海量的数据量,处理如此规模的图数据都充满挑战。 尤其是当目标是生成能够准确捕捉这些关系本质的嵌入表示时,…

如何使用Python代码实现给GPU预加热

如何使用Python代码实现给GPU预加热 一、引言二、使用深度学习框架进行预加热2.1 TensorFlow预加热2.2 PyTorch预加热三、使用CUDA进行预加热四、预加热的效果评估与优化五、结论与展望在高性能计算和深度学习领域,GPU(图形处理器)已经成为不可或缺的加速工具。然而,在实际…

Leecode刷题C语言之统计不是特殊数字的数字数量

执行结果:通过 执行用时和内存消耗如下&#xff1a; bool isPrime(int n){if(n<2){return false;}for(int i2;i*i<n;i){if(n%i0){return false;}}return true; } int nonSpecialCount(int l, int r) {int psqrt(l);int q sqrt(r);int len r-l1;for(int i p; i <q;…

影响电阻可靠性的因素

一、影响电阻可靠性的因素&#xff1a; 影响电阻可靠性的因素有温度系数、额定功率&#xff0c;最大工作电压、固有噪声和电压系数 &#xff08;一&#xff09;温度系数 电阻的温度系数表示当温度改变1摄氏度时&#xff0c;电阻阻值的相对变化&#xff0c;单位为ppm/C.电阻温度…

Typora-PicGo-OSS对象存储

Typora-PicGo-对象存储OSS 问题描述&#xff1a; 上次做完Gitee图床配置后&#xff0c;今天发现图床突然不能使用了&#xff0c;直到我查找到Gitee仓库变成私有后才发现做的图床被封禁了当前仓库因涉嫌外链滥用(RAW)&#xff0c;不支持设置为公开仓库&#xff0c;就导致我的笔…

ESP-KeyBoard:基于 ESP32-S3 的三模客制化机械键盘

概述 在这个充满挑战与机遇的数字化时代&#xff0c;键盘已经成为我们日常学习、工作、娱乐生活必不可少的设备。而在众多键盘中&#xff0c;机械键盘&#xff0c;以其独特的触感、清脆的敲击音和经久耐用的特性&#xff0c;已经成为众多游戏玩家和电子工程师的首选。本文将为…

nohup java -jar supporterSys.jar --spring.profiles.active=prod

文章目录 1、ps -ef | grep java2、kill 13713、ps -ef | grep java4、nohup java -jar supporterSys.jar --spring.profiles.activeprod &5、ps -ef | grep java1. 启动方式进程 1371进程 19994 2. 主要区别3. 可能的原因4. 建议 1、ps -ef | grep java rootshipper:~# p…

大公司如何实现打印机共享的?如何对打印机进行管控或者工号登录后进行打印?异地打印机共享的如何实现可以帮助用户在不同地理位置使用同一台打印机完成打印任务?

大公司如何实现打印机共享的&#xff1f;如何对打印机进行管控或者工号登录后进行打印&#xff1f;异地打印机共享的如何实现可以帮助用户在不同地理位置使用同一台打印机完成打印任务&#xff1f; 如果在局域网内&#xff0c;可以不需要进行二次开发&#xff0c;通过对打印机进…