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

​整合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.

相关推荐
热点推荐
张雨绮穿吊带看着骨架有点大哦!这大体格谁看了不喜欢?

张雨绮穿吊带看着骨架有点大哦!这大体格谁看了不喜欢?

草莓解说体育
2025-12-21 00:52:27
深度 | 打破9年 “空窗期”,加拿大总理卡尼周三起访华

深度 | 打破9年 “空窗期”,加拿大总理卡尼周三起访华

上观新闻
2026-01-12 20:44:05
悲喜夜:C罗破门难救主,巴黎爆冷0-1,利物浦4-1,尤文5-0,越南晋级

悲喜夜:C罗破门难救主,巴黎爆冷0-1,利物浦4-1,尤文5-0,越南晋级

侧身凌空斩
2026-01-13 06:20:08
美媒通告全球:歼-20飞越台岛上空,台军根本抓不到,统一成定局

美媒通告全球:歼-20飞越台岛上空,台军根本抓不到,统一成定局

来科点谱
2026-01-11 08:57:18
美国传来爆炸性丑闻!特朗普最担心的事情发生了,这下脸丢尽了

美国传来爆炸性丑闻!特朗普最担心的事情发生了,这下脸丢尽了

毛豆论道
2026-01-13 17:55:10
辽宁垮了!不重建又想捡漏,进攻效率倒数,对手包夹威尔斯就能赢

辽宁垮了!不重建又想捡漏,进攻效率倒数,对手包夹威尔斯就能赢

篮球资讯达人
2026-01-14 00:44:12
太子终于熬到皇帝驾崩,在登基大典上磕完头,才知道自己不是新帝

太子终于熬到皇帝驾崩,在登基大典上磕完头,才知道自己不是新帝

铭记历史呀
2026-01-13 22:16:50
长腿格格怕得脏病去检查了

长腿格格怕得脏病去检查了

毒舌扒姨太
2026-01-12 22:37:18
大清洗?邵佳一增加训练强度,部分国脚疲劳,近一半球员将被淘汰

大清洗?邵佳一增加训练强度,部分国脚疲劳,近一半球员将被淘汰

国足风云
2026-01-13 09:18:20
2026中国已进入财富6.0时代,很多人思维还停在1.0阶段!

2026中国已进入财富6.0时代,很多人思维还停在1.0阶段!

水木然
2026-01-12 23:48:12
A股:无需等待周三开盘了,市场已清晰,明天行情已可预见!

A股:无需等待周三开盘了,市场已清晰,明天行情已可预见!

财经大拿
2026-01-13 11:23:49
反转!中欧电车关税战终落幕 35.3%重税取消,最低价格承诺换和平

反转!中欧电车关税战终落幕 35.3%重税取消,最低价格承诺换和平

达文西看世界
2026-01-13 10:40:06
山东男篮接触新外援,1米93得分后卫有望加盟,曾在NBA单场35分

山东男篮接触新外援,1米93得分后卫有望加盟,曾在NBA单场35分

中国篮坛快讯
2026-01-13 16:50:37
奇妙的形容,安东尼:三球打球就像打2K,在场上过于随心所欲

奇妙的形容,安东尼:三球打球就像打2K,在场上过于随心所欲

懂球帝
2026-01-13 11:05:09
每天一个水煮蛋是“死亡催化剂”?提醒:想健康吃蛋,5个错别犯

每天一个水煮蛋是“死亡催化剂”?提醒:想健康吃蛋,5个错别犯

健康科普365
2026-01-11 20:30:03
精神病风波4年后,庞麦郎被传与龚玥菲大婚,知情人曝真实原因

精神病风波4年后,庞麦郎被传与龚玥菲大婚,知情人曝真实原因

不写散文诗
2026-01-13 16:28:50
CBA最新消息!曝布姆加盟新疆男篮,北京首钢大将正式复出

CBA最新消息!曝布姆加盟新疆男篮,北京首钢大将正式复出

体坛瞎白话
2026-01-13 16:55:01
永辉超市效仿胖东来20个月难止连亏 门店客流增长超80%

永辉超市效仿胖东来20个月难止连亏 门店客流增长超80%

大象新闻
2026-01-13 10:05:03
外交部:无论形势如何变化,中方都将继续同包括委内瑞拉在内的拉美国家深化务实合作

外交部:无论形势如何变化,中方都将继续同包括委内瑞拉在内的拉美国家深化务实合作

环球网资讯
2026-01-12 15:49:09
巨头集体跑路,社区团购凉透了

巨头集体跑路,社区团购凉透了

快刀财经
2026-01-12 22:36:46
2026-01-14 01:12:49
deephub incentive-icons
deephub
CV NLP和数据挖掘知识
1889文章数 1442关注度
往期回顾 全部

科技要闻

每年10亿美元!谷歌大模型注入Siri

头条要闻

李在明访日与高市早苗会谈 提到中国

头条要闻

李在明访日与高市早苗会谈 提到中国

体育要闻

他带出国乒世界冠军,退休后为爱徒返场

娱乐要闻

蔡卓妍承认新恋情,与男友林俊贤感情稳定

财经要闻

"天量存款"将到期 资金会否搬入股市?

汽车要闻

限时9.99万元起 2026款启辰大V DD-i虎鲸上市

态度原创

亲子
数码
艺术
健康
家居

亲子要闻

孕激素的威力算是见识到了!网友:喝不下水,胆汁吐没了就吐泡泡

数码要闻

PC硬件全线涨价?这几款RTX 50系游戏本竟敢“逆势”维持原价

艺术要闻

461米!14亿美元!越南第一高楼,形如“竹捆”

血常规3项异常,是身体警报!

家居要闻

现代简逸 寻找生活的光

无障碍浏览 进入关怀版