《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.pswp.cn/bicheng/76050.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76050.shtml
英文地址,請注明出處:http://en.pswp.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…