整合LlamaIndex与LangChain构建高级的查询处理系统

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 该文阐述了如何结合LlamaIndex和LangChain构建一个扩展性和定制性强的代理RAG应用。LlamaIndex擅长智能搜索,LangChain提供跨平台兼容性。代理RAG允许大型语言模型访问多个查询引擎,增强决策能力和多样化回答。文章通过示例代码展示了如何设置LLM、嵌入模型、LlamaIndex索引及查询引擎,并将它们转换为LangChain兼容的工具,实现高效、精准的问题解答。通过多代理协作,系统能处理复杂查询,提高答案质量和相关性。

构建大型语言模型应用程序可能会颇具挑战,尤其是当我们在不同的框架(如Langchain和LlamaIndex)之间进行选择时。LlamaIndex在智能搜索和数据检索方面的性能令人瞩目,而LangChain则作为一个更加通用的应用程序框架,提供了更好的与各种平台的兼容性。

本篇文章将介绍如何将LlamaIndex和LangChain整合使用,创建一个既可扩展又可定制的代理RAG(Retrieval-Augmented Generation)应用程序,利用两种技术的强大功能,开发出能够处理复杂查询并提供精准答案的高效应用程序。

在我们继续实施之前,需要简单的介绍代理RAG的一些知识:

代理RAG是一种基于代理的RAG实现方式。与传统的一般RAG方法相比,代理RAG在自主性和决策能力方面有了显著提升。我们通过授权大型语言模型(LLM)访问多个RAG查询引擎来创建一个复杂的推理循环。每个查询引擎都作为一种工具,能根据需要被LLM调用。这种结构不仅使得执行复杂决策成为可能,还扩展了系统回答各种查询的能力,并能够更好地为用户提供最适宜的响应。

通过这种方式,代理RAG能够在提供答案的同时,考虑到信息的来源多样性和质量,从而在提供答案时实现更高的准确性和相关性。这种模型的实现,为处理复杂问题和提供创新解决方案提供了更强大的工具。

首先我们定义基本LLM和嵌入模型

 # LLM 
 llm=ChatOpenAI(model_name="gpt-4-1106-preview", temperature=0, streaming=True)

 # Embedding Model
 embed_model=OpenAIEmbedding(
     model="text-embedding-3-small", embed_batch_size=100
 )

 # Set Llamaindex Configs
 Settings.llm=llm
 Settings.embed_model=embed_model

然后利用LlamaIndex的索引和检索功能为文档定义单独的查询引擎。

 #Building Indexes for each of the Documents
 try:
     storage_context=StorageContext.from_defaults(
         persist_dir="./storage/lyft"
     )
     lyft_index=load_index_from_storage(storage_context)

     storage_context=StorageContext.from_defaults(
         persist_dir="./storage/uber"
     )
     uber_index=load_index_from_storage(storage_context)

     index_loaded=True
     print("Index was already created. We just loaded it from the local storage.")

 except:

     index_loaded=False
     print("Index is not present. We need it to create it again.")

 ifnotindex_loaded:

     print("Creating Index..")

     # load data
     lyft_docs=SimpleDirectoryReader(
         input_files=["./data/10k/lyft_2021.pdf"]
     ).load_data()
     uber_docs=SimpleDirectoryReader(
         input_files=["./data/10k/uber_2021.pdf"]
     ).load_data()

     # build index
     lyft_index=VectorStoreIndex.from_documents(lyft_docs)
     uber_index=VectorStoreIndex.from_documents(uber_docs)

     # persist index
     lyft_index.storage_context.persist(persist_dir="./storage/lyft")
     uber_index.storage_context.persist(persist_dir="./storage/uber")

     index_loaded=True

 #Creating Query engines on top of the indexes
 lyft_engine=lyft_index.as_query_engine(similarity_top_k=3)
 uber_engine=uber_index.as_query_engine(similarity_top_k=3)

 print("LlamaIndex Query Engines created successfully.")

然后使用LlamaIndex的QueryEngineTool抽象类将查询引擎转换为工具,这些工具将稍后提供给LLM使用。

 #creating tools for each of our query engines
 query_engine_tools= [

     QueryEngineTool(
         query_engine=lyft_engine,
         metadata=ToolMetadata(
             name="lyft_10k",
             description=(
                 "Provides information about Lyft financials for year 2021. "
                 "Use a detailed plain text question as input to the tool."
             ),
         ),
     ),
     QueryEngineTool(
         query_engine=uber_engine,
         metadata=ToolMetadata(
             name="uber_10k",
             description=(
                 "Provides information about Uber financials for year 2021. "
                 "Use a detailed plain text question as input to the tool."
             ),
         ),
     ),
 ]

然后我们将LlamaIndex工具转换为与Langchain代理兼容的格式,这样就可以和Langchain 进行对接了。

 llamaindex_to_langchain_converted_tools= [t.to_langchain_tool() fortinquery_engine_tools]

除此以外我们还定义了一个附加的带有Web搜索功能的Langchain工具。这样可以进行页面搜索

 search=DuckDuckGoSearchRun()

 duckduckgo_tool=Tool(
         name='DuckDuckGoSearch',
         func=search.run,
         description='Use for when you need to perform an internet search to find information that another tool can not provide.'
 )   

 langchain_tools= [duckduckgo_tool]


 #Combine to create final list of tools
 tools=llamaindex_to_langchain_converted_tools+langchain_tools

下面就是Langchain的工作了,初始化调用代理。

 system_context="You are a stock market expert.\
 You will answer questions about Uber and Lyft companies as in the persona of a veteran stock market investor."

 prompt=ChatPromptTemplate.from_messages(
     [
         (
             "system",
             system_context,
         ),
         ("placeholder", "{chat_history}"),
         ("human", "{input}"),
         ("placeholder", "{agent_scratchpad}"),
     ]
 )

 # Construct the Tools agent
 agent=create_tool_calling_agent(llm, tools, prompt,)

 # Create an agent executor by passing in the agent and tools
 agent_executor=AgentExecutor(agent=agent, tools=tools, verbose=True, return_intermediate_steps=True, handle_parsing_errors=True, max_iterations=10)

然就就可以进行测试了。

测试1:

 question =  "What was Lyft's revenue growth in 2021?"

 response = agent_executor.invoke({"input": question})
 print("\nFinal Response:", response['output'])

代理正确地调用了lyft_10k查询引擎工具。

测试2:

 question =  "Is Uber profitable?"

 response = agent_executor.invoke({"input": question})
 print("\nFinal Response:", response['output'])

代理正确调用了uber_10k查询引擎工具。

测试3:

 question =  "List me the names of Uber's board of directors."

 response = agent_executor.invoke({"input": question})
 print("\nFinal Response:", response['output'])

我们这个信息超出了任何检索工具的范围,所以代理决定调用外部搜索工具,然后返回结果。

可以看到,我们的例子完美的结合了2者的优势,通过引入多个代理可以进一步提高系统的效率和精准度。每个代理可以专门处理同一领域内的不同文档子集,使得信息检索更为精细和专业。

我们可以设定一名代理来担任这些代理的协调者或主管。这名负责监控和调节各个代理的活动,确保信息流动的协调一致,并对整体查询过程进行优化。这种层次化的管理结构不仅优化了数据处理流程,也提高了响应速度和准确性,使得整个系统在处理复杂查询时更加高效和可靠。

通过这种方法,我们可以实现一个更加动态和适应性强的RAG系统,能够更好地满足不断变化的用户需求和应对多样化的信息挑战。希望本文能帮助你了解如何有效地整合LlamaIndex和LangChain,以构建一个高效、可扩展的代理RAG应用程序。
https://avoid.overfit.cn/post/f314677d41904595b953a6a3e7349705

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
2月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
618 2
|
2月前
|
SQL 数据库
LangChain-09 Query SQL DB With RUN GPT 查询数据库 并 执行SQL 返回结果
LangChain-09 Query SQL DB With RUN GPT 查询数据库 并 执行SQL 返回结果
40 2
|
10天前
|
弹性计算 自然语言处理 数据库
通过阿里云Milvus和LangChain快速构建LLM问答系统
本文介绍如何通过整合阿里云Milvus、阿里云DashScope Embedding模型与阿里云PAI(EAS)模型服务,构建一个由LLM(大型语言模型)驱动的问题解答应用,并着重演示了如何搭建基于这些技术的RAG对话系统。
|
4月前
|
机器学习/深度学习 SQL 数据挖掘
ADB优化器背后的秘密:如何用成本估算和规则引擎编织高效的查询网络?
【8月更文挑战第27天】AnalyticDB (ADB) 是一款专为大规模数据集设计的高性能分析型数据库。本文深入探讨ADB的优化器如何通过成本估算、规则引擎及机器学习等策略生成高效执行计划。成本估算是选择最优路径的关键;规则引擎通过谓词下推等手段优化查询;机器学习则使优化器能基于历史数据预测执行效率。结合示例代码与执行计划分析,展现了ADB在提升查询性能方面的强大功能。未来,ADB将继续进化以满足日益增长的大数据分析需求。
45 0
|
1月前
|
JSON 数据可视化 NoSQL
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
本文介绍了LangChain的LLM Graph Transformer框架,探讨了文本到图谱转换的双模式实现机制。基于工具的模式利用结构化输出和函数调用,简化了提示工程并支持属性提取;基于提示的模式则为不支持工具调用的模型提供了备选方案。通过精确定义图谱模式(包括节点类型、关系类型及其约束),显著提升了提取结果的一致性和可靠性。LLM Graph Transformer为非结构化数据的结构化表示提供了可靠的技术方案,支持RAG应用和复杂查询处理。
135 2
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
|
2月前
|
SQL 数据库
LangChain-08 Query SQL DB 通过GPT自动查询SQL
LangChain-08 Query SQL DB 通过GPT自动查询SQL
21 3
|
3月前
|
人工智能 自然语言处理 API
深入浅出 LangChain 与智能 Agent:构建下一代 AI 助手
我们小时候都玩过乐高积木。通过堆砌各种颜色和形状的积木,我们可以构建出城堡、飞机、甚至整个城市。现在,想象一下如果有一个数字世界的乐高,我们可以用这样的“积木”来构建智能程序,这些程序能够阅读、理解和撰写文本,甚至与我们对话。这就是大型语言模型(LLM)能够做到的,比如 GPT-4,它就像是一套庞大的乐高积木套装,等待我们来发掘和搭建。
128 1
|
4月前
|
机器学习/深度学习 自然语言处理 算法
LangChain 构建问题之智能体协同中的决策机制的实现如何解决
LangChain 构建问题之智能体协同中的决策机制的实现如何解决
50 1
|
4月前
|
人工智能 自然语言处理 前端开发
LangChain 构建问题之MetaGPT 和 ChatDev 的支持功能差异如何解决
LangChain 构建问题之MetaGPT 和 ChatDev 的支持功能差异如何解决
84 0
|
4月前
|
数据可视化 Unix Linux
LangChain 构建问题之可视化智能代理对游戏的生成过程如何解决
LangChain 构建问题之可视化智能代理对游戏的生成过程如何解决
36 0