LlamaIndex 使用 RouterOutputAgentWorkflow

LlamaIndex 中提供了一个 RouterOutputAgentWorkflow 功能,可以集成多个 QueryTool,根据用户的输入判断使用那个 QueryEngine,在做查询的时候,可以从不同的数据源进行查询,例如确定的数据从数据库查询,如果是语义查询可以从向量数据库进行查询。本文将实现两个搜索引擎,根据不同 Query 使用不同 QueryEngine。

安装 MySQL 依赖

pip install mysql-connector-python  

搜索引擎

定义搜索引擎,初始两个数据源

  • 使用 MySQL 作为数据库的数据源
  • 使用 VectorIndex 作为语义搜索数据源
from pathlib import Path
from llama_index.core.tools import QueryEngineTool
from llama_index.core import VectorStoreIndex
import llm
from llama_index.core import SimpleDirectoryReader
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core.query_engine import NLSQLTableQueryEngine
from llama_index.core import Settings
from llama_index.core import SQLDatabase

from sqlalchemy import create_engine, MetaData, Table, Column, String, Integer, select
Settings.llm = llm.get_ollama("mistral-nemo")
Settings.embed_model = llm.get_ollama_embbeding()

engine = create_engine(
    'mysql+mysqlconnector://root:123456@localhost:13306/db_llama', 
    echo=True  
)

def init_db():
    # 初始化数据库
    metadata_obj = MetaData()

    table_name = "city_stats"
    city_stats_table = Table(
        table_name,
        metadata_obj,
        Column("city_name", String(16), primary_key=True),
        Column("population", Integer, ),
        Column("state", String(16), nullable=False),
    )

    metadata_obj.create_all(engine)

    sql_database = SQLDatabase(engine, include_tables=["city_stats"])
    from sqlalchemy import insert
    rows = [
        {"city_name": "New York City", "population": 8336000, "state": "New York"},
        {"city_name": "Los Angeles", "population": 3822000, "state": "California"},
        {"city_name": "Chicago", "population": 2665000, "state": "Illinois"},
        {"city_name": "Houston", "population": 2303000, "state": "Texas"},
        {"city_name": "Miami", "population": 449514, "state": "Florida"},
        {"city_name": "Seattle", "populat
### LlamaIndex 的基本概念与使用方法 LlamaIndex 是一种用于文本数据处理和查询的强大工具,它支持对一系列字符串进行索引化操作,并提供灵活的查询接口[^1]。通过结合向量存储、总结索引和工具检索器等多种技术,LlamaIndex 能够实现高效的文档检索功能[^2]。 以下是基于 StringIterableReader 和简单查询的一个基础示例: #### 基础代码示例 ```python from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader, StringIterableReader # 准备要索引化的文本数据 documents = StringIterableReader().load_data(texts=["这是一个测试文档", "这是另一个测试文档"]) # 创建索引 index = GPTSimpleVectorIndex.from_documents(documents) # 进行查询 query_result = index.query("请告诉我关于测试的信息") print(query_result.response) ``` 上述代码展示了如何利用 `StringIterableReader` 加载一组字符串作为文档集合,并将其转换为可查询的向量索引形式。随后,可以通过 `.query()` 方法执行自然语言查询并获取响应结果。 --- ### 高级功能:构建聊天引擎 除了简单的文本查询外,LlamaIndex 还能被用来构建更复杂的交互式系统,比如聊天机器人。这通常涉及以下几个步骤: 1. **安装依赖** 确保已正确安装 LlamaIndex 库及其相关组件[^3]。 ```bash pip install llama-index ``` 2. **加载数据源** 数据可以来自文件、数据库或其他外部服务。这里继续沿用之前的 `StringIterableReader` 示例。 3. **创建索引结构** 使用合适的索引类型(如矢量索引),以便后续快速匹配相关内容。 4. **配置对话引擎** 将索引集成至聊天框架中,允许用户输入自由格式的问题并与之互动。 完整流程如下所示: ```python from llama_index import ServiceContext, set_global_service_context from llama_index.llms import OpenAI from llama_index.chat_engine.types import ChatMode from llama_index.indices.vector_store import VectorStoreIndex from llama_index import SimpleDirectoryReader # 设置全局服务上下文 (例如指定使用LLM 模型) llm = OpenAI(model="gpt-3.5-turbo") service_context = ServiceContext.from_defaults(llm=llm) set_global_service_context(service_context) # 导入本地目录中的文档 reader = SimpleDirectoryReader(input_dir="./data") docs = reader.load_data() # 构建向量索引 index = VectorStoreIndex.from_documents(docs) # 初始化聊天引擎 chat_engine = index.as_chat_engine(chat_mode=ChatMode.CONTEXTUAL) # 开始会话循环 while True: user_input = input("请输入您的问题: ") response = chat_engine.chat(user_input) print(f"回答: {response}") ``` 此脚本实现了从读取静态文件到动态问答的功能扩展。 --- ### 自定义知识库索引 对于更大规模的应用场景,可能需要额外考虑以下几点优化措施: - **自定义嵌入模型**:替换默认嵌入算法以适配特定领域需求[^4]; - **持久化存储机制**:保存生成好的索引供未来重复调用而无需重新计算; - **多模态融合能力**:引入图片或音频等形式的数据扩充信息维度。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值