网易首页 > 网易号 > 正文 申请入驻

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

0
分享至


构建大型语言模型应用程序可能会颇具挑战,尤其是当我们在不同的框架(如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.")
if not index_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() for t in query_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

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
15.6公里每秒!伴随巨响声,1吨重火球坠落美国:击穿房子屋顶

15.6公里每秒!伴随巨响声,1吨重火球坠落美国:击穿房子屋顶

肖兹探秘说
2026-03-24 16:32:33
骑士续约哈登有两种方式哈登选哪一种? 明夏再离开骑士?

骑士续约哈登有两种方式哈登选哪一种? 明夏再离开骑士?

仰卧撑FTUer
2026-03-25 09:29:35
佛山市委常委、顺德区委书记陈新�...

佛山市委常委、顺德区委书记陈新�...

新浪财经
2026-03-25 04:09:08
租客入住两年半垃圾堆满屋 房东:拉了两车垃圾,废品卖了98元,已让其退租离开

租客入住两年半垃圾堆满屋 房东:拉了两车垃圾,废品卖了98元,已让其退租离开

红星新闻
2026-03-24 19:11:38
陕西女警花卧底被揪出,被歹徒折磨7天解救:人都已经垮了

陕西女警花卧底被揪出,被歹徒折磨7天解救:人都已经垮了

罪案洞察者
2025-03-07 08:59:25
拖垮一个普通家庭,只需要一台20万的车。

拖垮一个普通家庭,只需要一台20万的车。

老陆不老
2026-03-24 20:20:23
忍无可忍!25万捷克人上街怒吼:我们拒绝成为下一个匈牙利

忍无可忍!25万捷克人上街怒吼:我们拒绝成为下一个匈牙利

阿凫爱吐槽
2026-03-25 13:24:49
张雪峰心源性猝死离世,该如何用药并急救来避免悲剧?

张雪峰心源性猝死离世,该如何用药并急救来避免悲剧?

庄时利和
2026-03-25 11:44:24
81年,我娶了首长家保姆,洞房夜她告诉我一个秘密

81年,我娶了首长家保姆,洞房夜她告诉我一个秘密

小月故事
2026-03-10 13:47:17
长得漂亮却坏事做尽,3次入狱,被摘除4处器官的她,现况如何?

长得漂亮却坏事做尽,3次入狱,被摘除4处器官的她,现况如何?

小蔑谈事
2026-03-25 09:45:29
宁德时代跌落神坛?充电5分钟跑520公里:却被车企集体“背刺”?

宁德时代跌落神坛?充电5分钟跑520公里:却被车企集体“背刺”?

芭比衣橱
2026-03-24 14:06:59
波兰磨刀:谁将是压垮俄罗斯的最后一根稻草

波兰磨刀:谁将是压垮俄罗斯的最后一根稻草

民间胡扯老哥
2026-03-23 18:56:09
“美国有意停火一个月,与伊朗达成协议”,以色列担心特朗普为宣布胜利而妥协,美国前CIA局长:特朗普现在正手忙脚乱,比起他我更信伊朗

“美国有意停火一个月,与伊朗达成协议”,以色列担心特朗普为宣布胜利而妥协,美国前CIA局长:特朗普现在正手忙脚乱,比起他我更信伊朗

每日经济新闻
2026-03-25 09:00:07
黄金突然大涨!

黄金突然大涨!

蓬勃新闻
2026-03-25 11:28:32
中国未来最大敌人:不是特朗普,而是手握杀招、重构科技规则的他

中国未来最大敌人:不是特朗普,而是手握杀招、重构科技规则的他

共工之锚
2026-03-25 01:10:27
大众正式官宣!新车3月31日上市

大众正式官宣!新车3月31日上市

手机评测室
2026-03-25 11:49:51
名宿之子下放中乙,首战就降维打击独中两元,凸显海港决策之失误

名宿之子下放中乙,首战就降维打击独中两元,凸显海港决策之失误

零度眼看球
2026-03-25 07:29:39
日本不再欢迎中国人?3月起日本签证“一刀切”,华人进退两难!

日本不再欢迎中国人?3月起日本签证“一刀切”,华人进退两难!

瑛派儿老黄
2026-03-23 16:53:21
大兴机场高速服务区沦为“聪明人”免费停车场

大兴机场高速服务区沦为“聪明人”免费停车场

新京报
2026-03-24 22:28:57
张雪峰去世后续!公司现状曝光,门上对联被拆下,殡葬人员曝后事

张雪峰去世后续!公司现状曝光,门上对联被拆下,殡葬人员曝后事

阿凫爱吐槽
2026-03-25 11:25:56
2026-03-25 14:08:49
deephub incentive-icons
deephub
CV NLP和数据挖掘知识
1958文章数 1461关注度
往期回顾 全部

科技要闻

红极一时却草草收场,Sora宣布正式关停

头条要闻

特朗普:希望通过外交方式停战 以"挽救百万人生命"

头条要闻

特朗普:希望通过外交方式停战 以"挽救百万人生命"

体育要闻

NBA最强左手射手,是个右撇子

娱乐要闻

张雪峰经抢救无效不幸去世 年仅41岁

财经要闻

张雪峰:寒门讲师的商业跃迁

汽车要闻

智己LS8放大招 30万内8系旗舰+全线控底盘秀实力

态度原创

亲子
游戏
家居
公开课
军事航空

亲子要闻

深夜时谈 樊登:别让孩子没苦硬吃,父母的爱是他未来解决苦难的动力

俄罗斯末日射击游戏《地铁》新作细节曝光

家居要闻

轻奢堇天府 小资情调

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

以色列媒体:美国计划于4月9日结束对伊朗战争

无障碍浏览 进入关怀版