《AI大模型应知应会100篇》加餐篇:LlamaIndex 与 LangChain 的无缝集成

加餐篇:LlamaIndex 与 LangChain 的无缝集成


问题背景:在实际应用中,开发者常常需要结合多个框架的优势。例如,使用 LangChain 管理复杂的业务逻辑链,同时利用 LlamaIndex 的高效索引和检索能力构建知识库。本文在基于 第56篇:LangChain快速入门与应用示例和 第57篇:LlamaIndex使用指南:构建高效知识库基础上,通过 cmd方式集成、基于Streamlit UI集成、基于Ollama本地大模型集成 三个步骤以实战案例展示如何将两者无缝集成,构建一个智能客服系统,抛砖引玉、以飨读者。

在这里插入图片描述

1. LlamaIndex 与 LangChain CMD界面集成

完整代码案例

from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.runnable import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.retrievers import VectorIndexRetriever# Step 1: 使用 LlamaIndex 构建知识库索引
# 数据加载:从本地目录加载文档
documents = SimpleDirectoryReader("./knowledge_base").load_data()# 创建向量索引
index = VectorStoreIndex.from_documents(documents)# 初始化检索器
retriever = VectorIndexRetriever(index=index, similarity_top_k=5)# 创建查询引擎
query_engine = RetrieverQueryEngine(retriever=retriever)# Step 2: 使用 LangChain 构建对话链
# 定义提示模板
prompt = ChatPromptTemplate.from_messages([("system", "你是一个智能客服助手,以下是相关文档内容:\n{context}"),("human", "{query}")
])# 初始化大模型
llm = ChatOpenAI(model="gpt-4o")# 将 LlamaIndex 查询引擎嵌入到 LangChain 链中
def retrieve_context(query):response = query_engine.query(query)return response.response# 构建 LangChain 链路
chain = ({"context": RunnablePassthrough() | retrieve_context, "query": RunnablePassthrough()}| prompt| llm| StrOutputParser()
)# Step 3: 执行查询
query = "公司2023年的主要产品有哪些?"
result = chain.invoke(query)
print(result)

输出结果

"根据知识库内容,公司2023年的主要产品包括智能客服系统、数据分析平台和区块链解决方案。"

说明

Step 1: 使用 LlamaIndex 构建知识库索引
  1. 数据加载:通过 SimpleDirectoryReader 加载本地文档(如 PDF、Word 或文本文件)。
  2. 索引构建:使用 VectorStoreIndex 创建向量索引,支持高效的相似性检索。
  3. 查询引擎:通过 RetrieverQueryEngine 提供对索引的访问接口。
Step 2: 使用 LangChain 构建对话链
  1. 提示模板:定义对话模板,动态注入检索到的上下文信息。
  2. 检索函数:通过 RunnablePassthrough 将用户输入传递给 LlamaIndex 查询引擎,获取相关上下文。
  3. 链式调用:将检索结果与用户输入组合后传递给大模型,生成最终答案。
Step 3: 执行查询
  • 用户提问“公司2023年的主要产品有哪些?”时:
    • LlamaIndex 从知识库中检索相关内容。
    • LangChain 将检索到的内容与用户问题结合,生成最终回答。

关键点解析

为什么选择 LlamaIndex 和 LangChain 集成?
  • LlamaIndex 的优势:专注于知识库构建,擅长处理大规模文档和复杂检索任务。
  • LangChain 的优势:提供灵活的链式调用机制,适合管理复杂的业务逻辑。
  • 无缝集成:通过自定义函数(如 retrieve_context),可以轻松将 LlamaIndex 的检索能力嵌入到 LangChain 的工作流中。
代码中的亮点
  1. 动态上下文注入

    • 使用 RunnablePassthrough 动态传递用户输入,并调用 LlamaIndex 的查询引擎。
    • 这种方式确保了检索结果始终与用户问题相关。
  2. 模块化设计

    • LlamaIndex 负责知识库的管理和检索。
    • LangChain 负责对话管理和最终答案生成。
    • 两者的分工明确,便于维护和扩展。

应用场景

  1. 企业智能客服:结合知识库和对话链,构建多轮对话的客服助手。
  2. 文档问答系统:快速检索和生成答案,适用于技术支持和内部培训。
  3. 研究文献分析:通过混合检索和链式调用,生成高质量的研究报告。


2. LlamaIndex 与 LangChain 集成 + 前端 UI

问题背景:为了提升用户体验,我们不仅需要一个强大的后端系统,还需要一个直观、友好的前端界面。以下案例将展示如何结合 LlamaIndexLangChain 构建后端逻辑,同时使用 Streamlit(一个流行的 Python 前端框架)打造一个交互式应用。

完整代码案例

后端逻辑:整合 LlamaIndex 和 LangChain
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.runnable import RunnablePassthrough
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.retrievers import VectorIndexRetriever# Step 1: 使用 LlamaIndex 构建知识库索引
def build_knowledge_base():# 数据加载:从本地目录加载文档documents = SimpleDirectoryReader("./knowledge_base").load_data()# 创建向量索引index = VectorStoreIndex.from_documents(documents)# 初始化检索器retriever = VectorIndexRetriever(index=index, similarity_top_k=5)# 创建查询引擎query_engine = RetrieverQueryEngine(retriever=retriever)return query_engine# Step 2: 使用 LangChain 构建对话链
def build_langchain_chain(query_engine):# 定义提示模板prompt = ChatPromptTemplate.from_messages([("system", "你是一个智能客服助手,以下是相关文档内容:\n{context}"),("human", "{query}")])# 初始化大模型llm = ChatOpenAI(model="gpt-4o")# 将 LlamaIndex 查询引擎嵌入到 LangChain 链中def retrieve_context(query):response = query_engine.query(query)return response.response# 构建 LangChain 链路chain = ({"context": RunnablePassthrough() | retrieve_context, "query": RunnablePassthrough()}| prompt| llm)return chain

前端实现:使用 Streamlit 构建用户界面
import streamlit as st# 初始化后端逻辑
query_engine = build_knowledge_base()
chain = build_langchain_chain(query_engine)# Streamlit 应用界面
st.title("智能客服助手")
st.markdown("请输入您的问题,我们将为您快速解答!")# 用户输入框
user_query = st.text_input("您的问题:", "")if user_query:# 显示加载动画with st.spinner("正在为您查找答案..."):# 调用后端逻辑生成回答response = chain.invoke(user_query)# 显示回答st.subheader("回答:")st.write(response)# 显示上下文信息st.subheader("参考内容:")retrieved_context = query_engine.query(user_query).source_nodesfor i, node in enumerate(retrieved_context):st.write(f"**来源 {i+1}:** {node.node.text[:200]}...")

运行方式

  1. 安装依赖

    pip install llama-index langchain openai streamlit
    
  2. 启动应用

    • 将上述代码保存为 app.py
    • 在终端运行以下命令:
      streamlit run app.py
      
    • 打开浏览器访问 http://localhost:8501,即可看到交互式界面。

输出结果

界面截图
  1. 首页布局

  2. 输入问题

    • 用户输入问题:“公司2023年的主要产品有哪些?”
  3. 生成回答

    回答:
    根据知识库内容,公司2023年的主要产品包括智能客服系统、数据分析平台和区块链解决方案。参考内容:
    来源 1: 公司2023年发布了一系列新产品,其中包括智能客服系统...
    来源 2: 数据分析平台采用了最新的机器学习算法...
    

说明

Step 1: 后端逻辑
  • LlamaIndex
    • 负责构建知识库索引,支持高效检索。
    • 通过 VectorStoreIndexRetrieverQueryEngine 提供上下文信息。
  • LangChain
    • 负责管理对话链,动态注入检索到的上下文。
    • 通过 RunnablePassthroughChatPromptTemplate 生成最终回答。
Step 2: 前端实现
  • Streamlit
    • 提供了一个简单易用的前端框架,适合快速构建交互式应用。
    • 使用 st.text_input 获取用户输入,st.spinner 显示加载动画,st.write 展示结果。
  • 用户体验
    • 界面简洁直观,用户只需输入问题即可获得答案。
    • 显示参考内容,增强透明度和可信度。

关键点解析

为什么选择 Streamlit?
  • 简单易用:无需复杂的前端开发经验,仅需几行代码即可构建交互式界面。
  • 实时更新:支持动态刷新,用户输入后立即显示结果。
  • 跨平台支持:可在本地或云端部署,方便扩展。
代码中的亮点
  1. 前后端分离
    • 后端逻辑专注于数据处理和业务逻辑。
    • 前端负责用户交互和结果展示。
  2. 动态加载
    • 使用 st.spinner 提供加载动画,提升用户体验。
  3. 参考内容展示
    • 显示检索到的上下文信息,帮助用户理解答案来源。

3. LlamaIndex 与 LangChain 集成 + 前端 UI+ Ollama


在案例中,如果需要将大模型调用从云端(如 OpenAI 的 ChatOpenAI)改为本地运行的 Ollama,我们需要调整代码以适配 Ollama 提供的接口。以下是详细的调整步骤和完整代码示例。

模型接口说明

  1. Ollama 简介

    • Ollama 是一个用于本地运行大语言模型(LLM)的工具,支持多种开源模型(如 Llama、Mistral、GPT-NeoX 等)。
    • 它提供了 RESTful API 接口,可以通过 HTTP 请求与本地模型交互。
  2. 调整点

    • 替换 langchain_openai.ChatOpenAI 为适配 Ollama 的自定义实现。
    • 使用 ollama 的 Python SDK 或直接通过 HTTP 请求调用本地模型。
    • 修改 LangChain 的链式调用逻辑,确保与 Ollama 的输出格式兼容。

本地Ollama大模型调用代码实现

后端逻辑:整合 LlamaIndex 和 LangChain + Ollama

from langchain.prompts import ChatPromptTemplate
from langchain.schema.runnable import RunnablePassthrough
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.retrievers import VectorIndexRetriever
import requests# Step 1: 使用 LlamaIndex 构建知识库索引
def build_knowledge_base():# 数据加载:从本地目录加载文档documents = SimpleDirectoryReader("./knowledge_base").load_data()# 创建向量索引index = VectorStoreIndex.from_documents(documents)# 初始化检索器retriever = VectorIndexRetriever(index=index, similarity_top_k=5)# 创建查询引擎query_engine = RetrieverQueryEngine(retriever=retriever)return query_engine# Step 2: 配置 Ollama 模型调用
class OllamaLLM:def __init__(self, model_name="llama2", base_url="http://localhost:11434"):self.model_name = model_nameself.base_url = base_urldef invoke(self, prompt):# 发送请求到 Ollamaresponse = requests.post(f"{self.base_url}/api/generate",json={"model": self.model_name,"prompt": prompt,"stream": False})if response.status_code == 200:result = response.json()return result.get("response", "")else:raise Exception(f"Error calling Ollama: {response.text}")# Step 3: 使用 LangChain 构建对话链
def build_langchain_chain(query_engine, ollama_llm):# 定义提示模板prompt = ChatPromptTemplate.from_messages([("system", "你是一个智能客服助手,以下是相关文档内容:\n{context}"),("human", "{query}")])# 将 LlamaIndex 查询引擎嵌入到 LangChain 链中def retrieve_context(query):response = query_engine.query(query)return response.response# 构建 LangChain 链路chain = ({"context": RunnablePassthrough() | retrieve_context, "query": RunnablePassthrough()}| prompt| ollama_llm.invoke)return chain

前端实现:使用 Streamlit 构建用户界面

import streamlit as st# 初始化后端逻辑
query_engine = build_knowledge_base()
ollama_llm = OllamaLLM(model_name="llama2")  # 使用本地 Ollama 模型
chain = build_langchain_chain(query_engine, ollama_llm)# Streamlit 应用界面
st.title("智能客服助手")
st.markdown("请输入您的问题,我们将为您快速解答!")# 用户输入框
user_query = st.text_input("您的问题:", "")if user_query:# 显示加载动画with st.spinner("正在为您查找答案..."):# 调用后端逻辑生成回答response = chain.invoke(user_query)# 显示回答st.subheader("回答:")st.write(response)# 显示上下文信息st.subheader("参考内容:")retrieved_context = query_engine.query(user_query).source_nodesfor i, node in enumerate(retrieved_context):st.write(f"**来源 {i+1}:** {node.node.text[:200]}...")

运行方式

  1. 安装依赖

    pip install llama-index langchain requests streamlit
    
  2. 启动 Ollama

    • 确保 Ollama 已安装并运行在本地(默认地址为 http://localhost:11434)。
    • 下载并加载目标模型(如 llama2):
      ollama pull llama2
      
  3. 启动应用

    • 将上述代码保存为 app.py
    • 在终端运行以下命令:
      streamlit run app.py
      
    • 打开浏览器访问 http://localhost:8501

输出结果

界面截图
  1. 首页布局

  2. 输入问题

    • 用户输入问题:“公司2023年的主要产品有哪些?”
  3. 生成回答

    回答:
    根据知识库内容,公司2023年的主要产品包括智能客服系统、数据分析平台和区块链解决方案。参考内容:
    来源 1: 公司2023年发布了一系列新产品,其中包括智能客服系统...
    来源 2: 数据分析平台采用了最新的机器学习算法...
    

关键调整点解析

  1. Ollama 模型调用

    • 使用 requests.post 向 Ollama 的 /api/generate 接口发送请求。
    • 参数包括 model(模型名称)和 prompt(输入提示)。
    • 返回值为 JSON 格式,提取 response 字段作为模型输出。
  2. LangChain 集成

    • 自定义 OllamaLLM 类,提供与 LangChain 兼容的 invoke 方法。
    • OllamaLLM.invoke 嵌入到链式调用中,替代原有的云端模型。
  3. 性能优化

    • 本地运行模型减少了网络延迟,提升了响应速度。
    • 可根据硬件性能选择合适的模型(如 llama2mistral 等)。

应用场景

  1. 离线环境:适用于无法访问云端服务的场景,如内网部署。
  2. 隐私保护:数据完全在本地处理,避免敏感信息泄露。
  3. 低成本运行:无需支付云端服务费用,适合预算有限的项目。

通过将大模型调用从云端切换为本地 Ollama,我们实现了更高的灵活性和隐私保护。结合 LlamaIndexLangChain 的强大功能,以及 Streamlit 的友好界面,最终构建了一个高效、易用的智能客服应用。

如果你有任何疑问或想法,欢迎在评论区交流讨论!


总结

通过本案例,我们展示了如何将 LlamaIndexLangChain 的强大功能与 Streamlit 的友好界面以及本地Ollama大模型API相结合,构建一个完整的智能客服应用。这种组合不仅提升了系统的功能性,还极大地改善了用户体验。

如果你有任何疑问或想法,欢迎在评论区交流讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习项目--分组卷积与ResNext网络实验探究(pytorch复现)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 ResNext是分组卷积的开始之作,这里本文将学习ResNext网络;本文复现了ResNext50神经网络,并用其进行了猴痘病分类实验…

从代码学习深度学习 - RNN PyTorch版

文章目录 前言一、数据预处理二、辅助训练工具函数三、绘图工具函数四、模型定义五、模型训练与预测六、实例化模型并训练训练结果可视化总结前言 循环神经网络(RNN)是深度学习中处理序列数据的重要模型,尤其在自然语言处理和时间序列分析中有着广泛应用。本篇博客将通过一…

JS DOM节点增删改查

增加节点 通过document.createNode()函数创建对象 // 创建节点 const div document.createElement(div) // 追加节点 document.body.appendChild(div) 克隆节点 删除节点

IMX6ULL学习整理篇——Linux使用更现代的GPIO操作简单设备

IMX6ULL学习篇——实战:使用设备树/Pinctl-gpio子系统驱动LED 前言 ​ 经过层层考验,我们即将接近现代的LED驱动的解决方案了。那就是使用最现代的方式开发一个简单的GPIO驱动外设。 ​ 如果您忘记了设备树的相关内容,请自行到笔者的上一篇…

2025-04-07 NO.3 Quest3 MR 配置

文章目录 1 MR 介绍1.1 透视1.2 场景理解1.3 空间设置 2 配置 MR 环境2.1 场景配置2.2 MR 配置 3 运行测试 配置环境: Windows 11Unity 6000.0.42f1Meta SDK v74.0.2Quest3 1 MR 介绍 1.1 透视 ​ 透视(Passthrough)是将应用的背景从虚拟的…

如何在 GitHub 上开源一个小项目:从创建到长期维护的完整指南

如何在 GitHub 上开源一个小项目:从创建到长期维护的完整指南 适用于 个人开发者、团队合作、企业开源,涵盖 Git 基础、GitHub 配置、最佳实践、社区互动、自动化 CI/CD 及长期维护策略。 📌 1. 注册 GitHub 账户 如果你还没有 GitHub 账户&…

【技术报告】GPT-4o 原生图像生成的应用与分析

【技术报告】GPT-4o 原生图像生成的应用与分析 1. GPT-4o 原生图像生成简介1.1 文本渲染能力1.2 多轮对话迭代1.3 指令遵循能力1.4 上下文学习能力1.5 跨模态知识调用1.6 逼真画质与多元风格1.7 局限性与安全性 2. GPT-4o 技术报告2.1 引言2.2 安全挑战、评估与缓解措施2.2.1 安…

React中的跨组件通信

在React中,跨组件通信有几种常见的方式。每种方式适用于不同的场景,下面是几种常见的跨组件通信方法: 1. 通过父子组件传递 Props 父组件可以通过 props 将数据传递给子组件,子组件只能接收和使用这些数据。 父组件&#xff08…

系统与网络安全------Windows系统安全(8)

资料整理于网络资料、书本资料、AI,仅供个人学习参考。 DNS DNS概述 为什么需要DNS系统 www.baidu.com与119.75.217.56,哪个更好记? 互联网中的114查号台/导航员 DNS(Domian Name System,域名系统)的功…

[ctfshow web入门] web16

信息收集 提示:对于测试用的探针,使用完毕后要及时删除,可能会造成信息泄露 试试url/phpinfo.php url/phpsysinfo.php url/tz.php tz.php能用 点击phpinfo,查看phpinfo信息,搜索flag,发现flag被保存为变量…

Go基础一(Maps Functions 可变参数 闭包 递归 Range 指针 字符串和符文 结构体)

Maps 1.创建map make(map[键类型]值类型) 2.设置键值对 name[key]value; 3. name[key]获取键值 3.1 key不存在 则返回 0 4.len()方法 返回 map 上 键值对数量 len(name) 5.delete()方法 从map中删除 键值对 delete(name,key) 6.clear()方法 map中删除所有键值对 clear(name) 7…

✅ 2025最新 | YOLO 获取 COCO 指标终极指南 | 从标签转换到 COCOAPI 评估 (训练/验证) 全覆盖【B 站教程详解】

✅ YOLO 轻松获取论文 COCO 指标:AP(small,medium,large )| 从标签转换到 COCOAPI 评估 (训练/验证) 全覆盖 文章目录 一、摘要二、为什么需要 COCO 指标评估 YOLO 模型?三、核心挑战与解决方案 (视频教程核…

ResNet改进(18):添加 CPCA通道先验卷积注意力机制

1. CPCA 模块 CPCA(Channel Prior Convolutional Attention)是一种结合通道先验信息的卷积注意力机制,旨在通过显式建模通道间关系来增强特征表示能力。 核心思想 CPCA的核心思想是将通道注意力机制与卷积操作相结合,同时引入通道先验知识,通过以下方式优化特征学习: 通…

SpringMVC的简单介绍

SpringMVC的简单介绍 SpringMVC 是一个基于 Java 的 Web 框架,是 Spring Framework 中用于构建 Web 应用的一个核心模块。它采用了 模型-视图-控制器 (MVC) 设计模式,能够帮助开发者更加清晰地分离业务逻辑、用户界面和请求处理,从而提高应用…

MES生产工单管理系统,Java+Vue,含源码与文档,实现生产工单全流程管理,提升制造执行效率与精准度

前言: MES生产工单管理系统是制造业数字化转型的核心工具,通过集成生产、数据、库存等模块,实现全流程数字化管理。以下是对各核心功能的详细解析: 一、生产管理 工单全生命周期管理 创建与派发:根据销售订单或生产计…

Redis常见问题排查与解决方案指南

Redis作为高性能的内存数据库,广泛应用于缓存、队列、实时统计等场景。但在实际使用中,开发者和运维人员常会遇到性能下降、内存溢出、主从同步失败等问题。本文将针对高频问题进行详细分析,并提供对应的解决方案和预防措施,助你快…

目标跟踪Deepsort算法学习2025.4.7

一.DeepSORT概述 1.1 算法定义 DeepSORT(Deep Learning and Sorting)是一种先进的多目标跟踪算法,它结合了深度学习和传统的目标跟踪技术,在复杂环境下实现了高精度和鲁棒性的目标跟踪。该算法的核心思想是通过融合目标的外观特征和运动特征,实现对多个目标的持续跟踪,…

从零开始开发HarmonyOS应用并上架

开发环境搭建(1-2天) 硬件准备 操作系统:Windows 10 64位 或 macOS 10.13 内存:8GB以上(推荐16GB) 硬盘:至少10GB可用空间 软件安装 下载 DevEco Studio 3.1(官网:…

Linux | 无头 Linux 服务器安装和设置

注:本文为 “Headless Linux” 相关文章合辑。 机翻未校。 How to Install and Set Up Headless Linux Server 如何安装和设置无头 Linux 服务器 Winnie Ondara Last Updated: January 31, 2023 A vast majority of Linux users are familiar with a Linux desk…

AI赋能数据库管理“最后一公里”,融合架构重塑数据库承载成本效能——zCloud 6.7与zData X 3.3正式发布

点击蓝字 关注我们 在数据驱动的新时代,数据库的多元化和智能化已成不可逆的趋势。3月31日,云和恩墨以“奇点时刻数智跃迁”为主题举办线上发布会,云和恩墨创始人兼总经理盖国强、公司数据库和生态产品群总经理熊军共同带来 zCloud 6.7与 zD…