使用 Llama-Agents、Qdrant 和 Kafka 进行高级实时 RAG

在当今数据驱动的世界中,实时处理和检索信息的能力至关重要。本文深入探讨了使用 Llama-Agents、Qdrant 和 Kafka高级实时检索增强生成(RAG)。通过整合这些强大的工具,我们创建了一个智能系统,能够高效管理数据的摄取、处理和检索。了解这种架构如何动态处理用户查询、平衡工作负载,并确保无缝访问有价值的数据,从而改变组织管理信息工作流的方式。

在这里插入图片描述

架构:

该过程始于一个 大型 JSON 对象,作为初始数据源。这个 JSON 对象被摄取到 MongoDB 中,MongoDB 是一个以灵活性和可扩展性著称的 NoSQL 数据库。MongoDB 便于高效存储和检索大型 JSON 对象,为进一步处理做好准备。

从 MongoDB 摄取的数据随后通过 Confluent 的 Kafka 源连接器 转移。这些连接器使数据能够流入 Kafka,确保数据的顺畅和高效流动。

一旦数据进入 Kafka,就会发布到 Kafka 消息队列。Kafka 在该架构中充当中央枢纽,管理和路由系统各组件之间的数据流。集成由 Qdrant 的 Kafka 接收连接器 促进,确保数据的无缝索引和检索。

来自用户的数据被交给 信息检索代理。该代理负责执行 语义搜索 操作。它使用汇总的数据并与 Qdrant 的实时数据 进行交互,Qdrant 是一个优化用于语义搜索的向量数据库。

下一个组件是 汇总代理,它处理来自 信息检索代理 的数据。该代理利用大型语言模型 Mistral-7b 来汇总传入的信息。

数据摄取:

下面的代码使用指定的参数创建一个 Qdrant 集合。然后,它从一个 ‘data.json’ 文件加载数据。在使用 MongoClient 建立与 MongoDB 的连接后,它选择 ‘startups’ 数据库及其中的 ‘docs’ 集合。

对于加载的 JSON 数据中的每个对象,脚本提取名称、图像、替代文本、描述、链接和城市等属性。它使用指定的嵌入模型为描述创建文本嵌入,构建一个包含集合名称、唯一 ID、嵌入向量和包含提取属性的有效载荷的文档。然后将该文档插入到 MongoDB 集合中。

from pymongo import MongoClient
from utils.app_utils import create_qdrant_collection
from fastembed import TextEmbedding
import json

collection_name: str = 'startups'
embed_model_name: str = 'snowflake/snowflake-arctic-embed-s'

# Ste 0: create qdrant_collection
create_qdrant_collection(collection_name=collection_name, embed_model=embed_model_name)

with open(file='data.json', mode='r') as file:
    data = json.load(file)

# Step 1: Connect to MongoDB
client = MongoClient('mongodb://127.0.0.1:27017/?replicaSet=rs0&directConnection=true')

# Step 2: Select Database
db = client['startups']

# Step 3: Select Collection
collection = db['docs']

for index, obj in enumerate(data):
    # Extract properties
    name: str = obj.get('name')
    images: str = obj.get('images')
    alt: str = obj.get('alt')
    description: str = obj.get('description')
    link: str = obj.get('link')
    city: str = obj.get('city')

    # Step 4: Create a Document to Insert
    embedding_model = TextEmbedding(model_name=embed_model_name)
    vector = next(embedding_model.embed(documents=description)).tolist()
    document = {
        "collection_name": collection_name,
        "id": index+1,
        "vector": vector,
        "payload": {
            "name": name,
            "city": city,
            "description": description,
            "images": images,
            "url": link
        }
    }

    # Step 5: Insert the Document into the Collection
    result = collection.insert_one(document)

    # Step 6: Print the Inserted Document's ID
    print("Inserted document ID:", result.inserted_id)

一旦数据被摄取到 Mongodb 中,我们的 CDC 就会启动,最终数据会出现在 Qdrant 中。有关 CDC 设置的详细说明,请 查看本文。

RAG 在实时数据上的应用:

以下代码定义了一个类 HybridQdrantOperations,用于管理在 Qdrant 服务器上的混合搜索操作。它初始化一个密集和稀疏嵌入模型,连接到本地 Qdrant 服务器,并加载一个 JSON 负载。hybrid_search 方法在执行时进行计时,使用 Qdrant 客户端执行搜索,返回给定查询文本的前几个相似结果的元数据。

import json
from qdrant_client import QdrantClient, models
from utils.decorator_utils import execution_time_decorator


class HybridQdrantOperations:
    def __init__(self):
        self.payload_path = "../data.json"
        self.collection_name = "startups"
        self.DENSE_MODEL_NAME = "snowflake/snowflake-arctic-embed-s"
        self.SPARSE_MODEL_NAME = "prithivida/Splade_PP_en_v1"
        # collect to our Qdrant Server
        self.client = QdrantClient(host="localhost", port=6333, api_key="th3s3cr3tk3y")
        self.client.set_model(self.DENSE_MODEL_NAME)
        # comment this line to use dense vectors only
        self.client.set_sparse_model(self.SPARSE_MODEL_NAME)
        self.metadata = []
        self.documents = []

    @execution_time_decorator
    def hybrid_search(self, text: str, top_k: int = 5):
        # self.client.query will have filters also if you want to do query on filter data.
        search_result = self.client.query(
            collection_name=self.collection_name,
            query_text=text,
            limit=top_k,  # 5 the closest results
        )
        # `search_result` contains found vector ids with similarity scores
        # along with the stored payload

        # Select and return metadata
        metadata = [hit.metadata for hit in search_result]
        return metadata

以下代码使用 llama-agents 和 kafka 设置了一个基于代理的系统,以管理和检索关于初创公司的信息。它首先初始化一个 HybridQdrantOperations 实例以进行混合搜索,并配置日志记录和 Kafka 连接详细信息。使用特定参数创建一个 Ollama 模型的实例,并使用 OllamaEmbedding 设置嵌入模型。

定义了一个函数 get_startup_info 来通过 Qdrant 执行混合搜索并将结果作为 JSON 返回。该函数使用 FunctionTool 包装成一个工具,并使用 ReActAgent 类创建一个代理 startup_tool_agent,配备该工具。另一个代理 summarization_agent 也被实例化,但没有任何工具。

该系统使用 KafkaMessageQueue 进行消息处理,连接到指定的 Kafka URL。初始化一个 ControlPlaneServer,将消息队列和 AgentOrchestrator 结合在一起,将控制平面的服务器端口设置为 8001。创建了两个 AgentService 实例:startup_service 用于检索初创公司信息,summarization_service 用于总结信息,每个实例都与各自的 代理Kafka 消息队列 关联,并分配唯一的服务端口(8002 和 8003)。该设置通过代理交互促进了初创公司信息的无缝检索和总结。

from llama_index.core import Settings
from llama_agents import (
    AgentService,
    AgentOrchestrator,
    ControlPlaneServer
)
from llama_index.embeddings.ollama import OllamaEmbedding
from llama_agents.message_queues.apache_kafka import KafkaMessageQueue
from llama_index.core.agent import ReActAgent
from llama_index.core.tools import FunctionTool
from llama_index.llms.ollama import Ollama
from retrievers.qdrant_ops import HybridQdrantOperations
import json

qdrant_ops = HybridQdrantOperations()
is_logging_enabled = True
# better managed from env
KAFKA_CONNECTION_URL = "localhost:9092"
llm = Ollama(base_url='http://localhost:11434', model='mistral:latest', temperature=0.8, request_timeout=300,
             system_prompt="You are an agent who consider the context passed "
                           "in, to answer any questions dont consider your prior "
                           "knowledge to answer and if you dont find the answer "
                           "please respond that you dont know.")
Settings.embed_model = OllamaEmbedding(base_url='http://localhost:11434', model_name='snowflake-arctic-embed:33m')


# create an agent
def get_startup_info(query: str) -> str:
    """Returns the information about startups."""
    if is_logging_enabled:
        print(f"Query from agent: {query}")
    resp = qdrant_ops.hybrid_search(text=query, top_k=5)
    if is_logging_enabled:
        print(f"Response from search: {resp}")
    return json.dumps(resp)


startup_info_tool = FunctionTool.from_defaults(fn=get_startup_info)
startup_tool_agent = ReActAgent.from_tools(tools=[startup_info_tool], llm=llm)
summarization_agent = ReActAgent.from_tools(tools=[], llm=llm)

message_queue = KafkaMessageQueue(url=KAFKA_CONNECTION_URL)

control_plane = ControlPlaneServer(
    message_queue=message_queue,
    orchestrator=AgentOrchestrator(llm=llm),
    port=8001,
)
startup_service = AgentService(
    agent=startup_tool_agent,
    message_queue=message_queue,
    description="Useful for getting the information about startups.",
    service_name="info_extract_agent",
    port=8002,
)
summarization_service = AgentService(
    agent=summarization_agent,
    message_queue=message_queue,
    description="Useful for consolidating or summarizing the information.",
    service_name="info_summarization_agent",
    port=8003,
)

以下代码设置了一个 LocalLauncher 来管理和执行使用先前定义的 startup_servicesummarization_servicecontrol_planemessage_queue 的代理服务。然后它进入一个无限循环,提示用户输入查询。如果用户输入 ‘bye’ 或 ‘exit’,循环将中断,程序结束。对于其他输入,启动程序使用 launch_single 方法执行查询并打印结果。该设置使得可以通过代理系统进行信息检索和总结的交互查询。

from llama_agents import LocalLauncher
from agent_with_rag_tool import startup_service, summarization_service, control_plane, message_queue

# launch it
launcher = LocalLauncher(
    [startup_service, summarization_service],
    control_plane,
    message_queue,
)

while True:
    input_query = input("Query (type 'bye' or 'exit' to quit the program ):")
    if input_query.lower() == 'bye' or input_query.lower() == 'exit':
        break
    result = launcher.launch_single(initial_task=input_query)
    print(f"Result: {result}")

一旦一切运行正常,下面应该是输出结果。

在这里插入图片描述

背景中发生了什么?

系统使用 llama-agents 框架通过 Kafka 平台管理查询,确保高效的主题创建、平衡和删除。当用户提交查询时,框架动态创建所需的 Kafka 主题并为这些主题注册消费者。然后启动代理以处理查询。控制平面协调工作流程,发布消息以启动任务并处理其完成。在查询处理并提供响应后,框架停止消费者并删除不再需要的主题,以确保高效的资源管理和系统性能。

在这里插入图片描述

未来(高度可扩展的概念)

在这里插入图片描述

上述架构是一个Agentic System,不同团队可以与专用代理进行交互,从多个数据源中检索相关信息,这些数据源包括SalesforceJiraAWS CloudWatch。这些源分别提供客户数据、项目管理信息和应用程序日志。以下是架构的详细分解:

数据源

  • Salesforce:管理与客户和销售相关的数据,包括潜在客户和机会。
  • Jira:处理项目管理任务和问题。
  • AWS CloudWatch:收集和监控应用程序日志。

源连接器:这些数据源的数据通过Confluent的Kafka源连接器被导入系统,实现数据流向Kafka的无缝传输。

Kafka消息队列:Kafka作为中央枢纽,管理和路由数据流向系统内的各个代理和组件。

代理

  • 信息检索代理:从导入的流中检索特定数据。
  • 汇总代理:处理并汇总检索到的数据,以便于理解。

Qdrant:使用Qdrant Kafka接收连接器存储和索引数据,实现高效的语义搜索能力。

控制平面

  • 协调者:管理工作流和数据处理顺序。
  • 服务元数据:存储与系统内服务和操作相关的元数据。

系统的五种用途

  1. 客户数据管理:通过与Salesforce的集成,销售团队可以向信息检索代理请求客户和销售相关的数据,如潜在客户和机会,确保他们拥有最新的信息。
  2. 项目管理:通过集成Jira,管理者可以查询摘要代理以获取项目进展的简要更新,管理问题,并检索详细的项目信息,有助于维护项目时间表和提高生产力。
  3. 日志监控:工程团队可以查询由AWS CloudWatch收集的应用程序日志。该系统为他们提供洞察和详细日志,以有效跟踪性能问题和故障排除。

结论:

在对一个强大的数据处理和检索系统的探索中,我们深入研究了如何通过将 llama-agents 框架与 Kafka 和 Qdrant 集成,有效管理用户查询和数据操作。通过利用 Salesforce、Jira 和 AWS CloudWatch 等组件,该系统确保了有价值数据的无缝摄取、处理和检索。这个智能系统动态处理 Kafka 主题,使各个团队能够与提供精确、符合其需求的信息的专用代理进行互动。资源的高效管理突显了系统在平衡工作负载和维持性能方面的能力。最终,这种架构展示了一种管理复杂数据工作流程的复杂方法,为希望增强其数据处理生成 AI 能力的组织提供了宝贵的蓝图。

如何学习大模型

现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。

作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。

下面这些都是我当初辛苦整理和花钱购买的资料,现在我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。

在这里插入图片描述

二、AI大模型视频教程

在这里插入图片描述

三、AI大模型各大学习书籍

在这里插入图片描述

四、AI大模型各大场景实战案例

在这里插入图片描述

五、结束语

学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。

再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。

因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。

1. **实现的功能** 文章描述的功能主要分为两部分:一是智能体应用的核心能力,二是大数据处理流程的整体功能。这些功能服务于数据价值最大化智能化决策。 - **智能体应用的功能**: - **记忆功能**:系统能够记住用户交互历史或上下文状态,实现个性化响应(例如,在对话中保持连续性)。 - **工具库集成**:提供外部工具(如API或第三方服务)的调用接口,支持用户执行复杂任务(例如,数据分析或自动化操作)。 - **text-to-sql**:允许用户通过自然语言查询数据库,自动转换为SQL指令并返回结果(例如,查询存储在湖仓中的数据)。 - **AI agent**:自主决策代理,能独立规划执行任务(例如,问题解答或任务调度)。 - **RAG(检索增强生成)**:结合检索外部知识库(如向量数据库)大模型生成,提升回答的准确性上下文相关性(例如,在问答系统中增强响应)。 - **大数据处理流程的功能**: - **数据采集**:从多源(如日志、传感器或用户输入)实时收集原始数据,支持后续分析。 - **数据存储与管理**:通过统一的存储系统(如湖仓一体)保存原始数据向量数据,确保数据可访问性一致性。 - **数据处理与分析**:对数据进行清洗、转换挖掘,应用算法模型(如机器学习)提取 insights,实现数据价值最大化。 - **数据可视化与应用**:将分析结果以图表或报告形式呈现,支持决策(例如,在业务场景中提供实时仪表盘)。 - **数据治理**:确保数据质量、安全合规,包括元数据管理反馈循环(例如,微调数据仓库存储用户反馈以优化模型)。 这些功能共同构成了一个完整的智能化系统,能够处理从数据输入到智能输出的全流程,提升效率数据驱动决策能力。 #### 2. **用到的技术栈** 技术栈覆盖了大模型管理、数据存储、处理引擎智能组件等多个层面。以下是主要技术栈的详细分解,基于引用内容整理。 - **大模型管理技术**: - 核心组件:支持通用大模型(如GPT系列)、领域私有化微调大模型(fine-tuning特定领域的LLMs)工具型大模型(针对特定任务的优化模型)。 - 相关工具:微调数据仓库用于存储训练反馈数据,提示词工程管理系统用于管理优化提示词内容(例如,通过A/B测试提升模型性能)。 - **数据存储与湖仓技术**: - 核心技术:湖仓一体(lakehouse)架构,结合数据湖(存储原始数据)数据仓库(存储结构化数据),特别强调向量数据库(用于存储向量数据,支持RAG)。 - 关键工具:如分布式存储系统(如Apache HDFS或AWS S3),支持大数据高并发访问。 - **大数据处理技术栈**: - **数据采集层**:工具如Apache Kafka或Fluentd,用于实时数据摄取。 - **数据处理层**:分布式计算框架(如Apache Spark)用于数据清洗转换,机器学习库(如TensorFlow或Scikit-learn)用于算法分析。 - **数据分析与可视化层**:可视化工具(如Tableau或Grafana)SQL引擎(如Presto),支持交互式查询报告生成。 - **数据治理层**:元数据管理工具(如Apache Atlas)治理框架,确保数据质量与合规。 - **智能体应用技术**: - AI agent框架:如LangChain或AutoGPT,实现代理的规划执行。 - RAG组件:检索引擎(如FAISS或Elasticsearch)结合生成模型(如LLaMA或BERT),提升上下文感知能力。 - text-to-sql引擎:基于自然语言处理(NLP)工具(如spaCy或BERT fine-tuning),实现文本到SQL的转换。 - 工具库集成:API网关微服务架构,连接外部工具(如数据库或第三方API)。 整体技术栈以“数据价值最大化”为核心,通过整合大模型大数据处理技术,实现高效、智能的应用。例如,在业务流程中,数据从湖仓存储→经Spark处理→输入AI agent生成响应→结果可视化。 ###我需要使用以上内容询问kimi,请帮我优化以上提示词
最新发布
10-16
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值