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

[复制链接]
发表于 2025-10-2 20:06:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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


题目配景:在实际应用中,开辟者经常必要联合多个框架的上风。比方,利用 LangChain 管理复杂的业务逻辑链,同时利用 LlamaIndex 的高效索引和检索本领构建知识库。本文在基于 第56篇:LangChain快速入门与应用示例和 第57篇:LlamaIndex利用指南:构建高效知识库根本上,通过 cmd方式集成、基于Streamlit UI集成、基于Ollama当地大模子集成 三个步调以实战案例展示怎样将两者无缝集成,构建一个智能客服体系,抛砖引玉、以飨读者。

1. LlamaIndex 与 LangChain CMD界面集成

完备代码案例

  1. from langchain_openai import ChatOpenAI
  2. from langchain.prompts import ChatPromptTemplate
  3. from langchain.schema.runnable import RunnablePassthrough
  4. from langchain_core.output_parsers import StrOutputParser
  5. from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
  6. from llama_index.core.query_engine import RetrieverQueryEngine
  7. from llama_index.core.retrievers import VectorIndexRetriever
  8. # Step 1: 使用 LlamaIndex 构建知识库索引
  9. # 数据加载:从本地目录加载文档
  10. documents = SimpleDirectoryReader("./knowledge_base").load_data()
  11. # 创建向量索引
  12. index = VectorStoreIndex.from_documents(documents)
  13. # 初始化检索器
  14. retriever = VectorIndexRetriever(index=index, similarity_top_k=5)
  15. # 创建查询引擎
  16. query_engine = RetrieverQueryEngine(retriever=retriever)
  17. # Step 2: 使用 LangChain 构建对话链
  18. # 定义提示模板
  19. prompt = ChatPromptTemplate.from_messages([
  20.     ("system", "你是一个智能客服助手,以下是相关文档内容:\n{context}"),
  21.     ("human", "{query}")
  22. ])
  23. # 初始化大模型
  24. llm = ChatOpenAI(model="gpt-4o")
  25. # 将 LlamaIndex 查询引擎嵌入到 LangChain 链中
  26. def retrieve_context(query):
  27.     response = query_engine.query(query)
  28.     return response.response
  29. # 构建 LangChain 链路
  30. chain = (
  31.     {"context": RunnablePassthrough() | retrieve_context, "query": RunnablePassthrough()}
  32.     | prompt
  33.     | llm
  34.     | StrOutputParser()
  35. )
  36. # Step 3: 执行查询
  37. query = "公司2023年的主要产品有哪些?"
  38. result = chain.invoke(query)
  39. print(result)
复制代码
输出结果

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

分析

Step 1: 利用 LlamaIndex 构建知识库索引


  • 数据加载:通过 SimpleDirectoryReader 加载当地文档(如 PDF、Word 或文本文件)。
  • 索引构建:利用 VectorStoreIndex 创建向量索引,支持高效的相似性检索。
  • 查询引擎:通过 RetrieverQueryEngine 提供对索引的访问接口。
Step 2: 利用 LangChain 构建对话链


  • 提示模板:界说对话模板,动态注入检索到的上下文信息。
  • 检索函数:通过 RunnablePassthrough 将用户输入通报给 LlamaIndex 查询引擎,获取干系上下文。
  • 链式调用:将检索结果与用户输入组合后通报给大模子,天生终极答案。
Step 3: 实行查询



  • 用户提问“公司2023年的重要产物有哪些?”时:

    • LlamaIndex 从知识库中检索干系内容。
    • LangChain 将检索到的内容与用户题目联合,天生终极答复。


关键点分析

为什么选择 LlamaIndex 和 LangChain 集成?



  • LlamaIndex 的上风:专注于知识库构建,善于处置处罚大规模文档和复杂检索使命。
  • LangChain 的上风:提供机动的链式调用机制,得当管理复杂的业务逻辑。
  • 无缝集成:通过自界说函数(如 retrieve_context),可以轻松将 LlamaIndex 的检索本领嵌入到 LangChain 的工作流中。
代码中的亮点


  • 动态上下文注入:

    • 利用 RunnablePassthrough 动态通报用户输入,并调用 LlamaIndex 的查询引擎。
    • 这种方式确保了检索结果始终与用户题目干系。

  • 模块化筹划:

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


应用场景


  • 文档问答体系:快速检索和天生答案,实用于技能支持和内部培训。
  • 研究文献分析:通过肴杂检索和链式调用,天生高质量的研究陈诉。


2. LlamaIndex 与 LangChain 集成 + 前端 UI

题目配景:为了提拔用户体验,我们不光必要一个强盛的后端体系,还必要一个直观、友好的前端界面。以下案例将展示怎样联合 LlamaIndex 和 LangChain 构建后端逻辑,同时利用 Streamlit(一个盛行的 Python 前端框架)打造一个交互式应用。
完备代码案例

后端逻辑:整合 LlamaIndex 和 LangChain

  1. from langchain_openai import ChatOpenAI
  2. from langchain.prompts import ChatPromptTemplate
  3. from langchain.schema.runnable import RunnablePassthrough
  4. from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
  5. from llama_index.core.query_engine import RetrieverQueryEngine
  6. from llama_index.core.retrievers import VectorIndexRetriever
  7. # Step 1: 使用 LlamaIndex 构建知识库索引
  8. def build_knowledge_base():
  9.     # 数据加载:从本地目录加载文档
  10.     documents = SimpleDirectoryReader("./knowledge_base").load_data()
  11.     # 创建向量索引
  12.     index = VectorStoreIndex.from_documents(documents)
  13.     # 初始化检索器
  14.     retriever = VectorIndexRetriever(index=index, similarity_top_k=5)
  15.     # 创建查询引擎
  16.     query_engine = RetrieverQueryEngine(retriever=retriever)
  17.     return query_engine
  18. # Step 2: 使用 LangChain 构建对话链
  19. def build_langchain_chain(query_engine):
  20.     # 定义提示模板
  21.     prompt = ChatPromptTemplate.from_messages([
  22.         ("system", "你是一个智能客服助手,以下是相关文档内容:\n{context}"),
  23.         ("human", "{query}")
  24.     ])
  25.     # 初始化大模型
  26.     llm = ChatOpenAI(model="gpt-4o")
  27.     # 将 LlamaIndex 查询引擎嵌入到 LangChain 链中
  28.     def retrieve_context(query):
  29.         response = query_engine.query(query)
  30.         return response.response
  31.     # 构建 LangChain 链路
  32.     chain = (
  33.         {"context": RunnablePassthrough() | retrieve_context, "query": RunnablePassthrough()}
  34.         | prompt
  35.         | llm
  36.     )
  37.     return chain
复制代码

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

  1. import streamlit as st
  2. # 初始化后端逻辑
  3. query_engine = build_knowledge_base()
  4. chain = build_langchain_chain(query_engine)
  5. # Streamlit 应用界面
  6. st.markdown("请输入您的问题,我们将为您快速解答!")
  7. # 用户输入框
  8. user_query = st.text_input("您的问题:", "")
  9. if user_query:
  10.     # 显示加载动画
  11.     with st.spinner("正在为您查找答案..."):
  12.         # 调用后端逻辑生成回答
  13.         response = chain.invoke(user_query)
  14.     # 显示回答
  15.     st.subheader("回答:")
  16.     st.write(response)
  17.     # 显示上下文信息
  18.     st.subheader("参考内容:")
  19.     retrieved_context = query_engine.query(user_query).source_nodes
  20.     for i, node in enumerate(retrieved_context):
  21.         st.write(f"**来源 {i+1}:** {node.node.text[:200]}...")
复制代码

运行方式


  • 安装依赖:
    1. pip install llama-index langchain openai streamlit
    复制代码
  • 启动应用:

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


输出结果

界面截图


  • 首页结构:
  • 输入题目:

    • 用户输入题目:“公司2023年的重要产物有哪些?”

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

分析

Step 1: 后端逻辑



  • LlamaIndex:

    • 负责构建知识库索引,支持高效检索。
    • 通过 VectorStoreIndex 和 RetrieverQueryEngine 提供上下文信息。

  • LangChain:

    • 负责管理对话链,动态注入检索到的上下文。
    • 通过 RunnablePassthrough 和 ChatPromptTemplate 天生终极答复。

Step 2: 前端实现



  • Streamlit:

    • 提供了一个简单易用的前端框架,得当快速构建交互式应用。
    • 利用 st.text_input 获取用户输入,st.spinner 表现加载动画,st.write 展示结果。

  • 用户体验:

    • 界面轻便直观,用户只需输入题目即可得到答案。
    • 表现参考内容,加强透明度和可信度。


关键点分析

为什么选择 Streamlit?



  • 简单易用:无需复杂的前端开辟履历,仅需几行代码即可构建交互式界面。
  • 及时更新:支持动态革新,用户输入后立刻表现结果。
  • 跨平台支持:可在当地或云端摆设,方便扩展。
代码中的亮点


  • 前后端分离:

    • 后端逻辑专注于数据处置处罚和业务逻辑。
    • 前端负责用户交互和结果展示。

  • 动态加载:

    • 利用 st.spinner 提供加载动画,提拔用户体验。

  • 参考内容展示:

    • 表现检索到的上下文信息,资助用户明白答案泉源。


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


在案例中,如果必要将大模子调用从云端(如 OpenAI 的 ChatOpenAI)改为当地运行的 Ollama,我们必要调解代码以适配 Ollama 提供的接口。以下是详细的调解步调和完备代码示例。
模子接口分析


  • Ollama 简介:

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

  • 调解点:

    • 更换 langchain_openai.ChatOpenAI 为适配 Ollama 的自界说实现。
    • 利用 ollama 的 Python SDK 或直接通过 HTTP 哀求调用当地模子。
    • 修改 LangChain 的链式调用逻辑,确保与 Ollama 的输特别式兼容。


当地Ollama大模子调用代码实现

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

  1. from langchain.prompts import ChatPromptTemplate
  2. from langchain.schema.runnable import RunnablePassthrough
  3. from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
  4. from llama_index.core.query_engine import RetrieverQueryEngine
  5. from llama_index.core.retrievers import VectorIndexRetriever
  6. import requests
  7. # Step 1: 使用 LlamaIndex 构建知识库索引
  8. def build_knowledge_base():
  9.     # 数据加载:从本地目录加载文档
  10.     documents = SimpleDirectoryReader("./knowledge_base").load_data()
  11.     # 创建向量索引
  12.     index = VectorStoreIndex.from_documents(documents)
  13.     # 初始化检索器
  14.     retriever = VectorIndexRetriever(index=index, similarity_top_k=5)
  15.     # 创建查询引擎
  16.     query_engine = RetrieverQueryEngine(retriever=retriever)
  17.     return query_engine
  18. # Step 2: 配置 Ollama 模型调用
  19. class OllamaLLM:
  20.     def __init__(self, model_name="llama2", base_url="http://localhost:11434"):
  21.         self.model_name = model_name
  22.         self.base_url = base_url
  23.     def invoke(self, prompt):
  24.         # 发送请求到 Ollama
  25.         response = requests.post(
  26.             f"{self.base_url}/api/generate",
  27.             json={
  28.                 "model": self.model_name,
  29.                 "prompt": prompt,
  30.                 "stream": False
  31.             }
  32.         )
  33.         if response.status_code == 200:
  34.             result = response.json()
  35.             return result.get("response", "")
  36.         else:
  37.             raise Exception(f"Error calling Ollama: {response.text}")
  38. # Step 3: 使用 LangChain 构建对话链
  39. def build_langchain_chain(query_engine, ollama_llm):
  40.     # 定义提示模板
  41.     prompt = ChatPromptTemplate.from_messages([
  42.         ("system", "你是一个智能客服助手,以下是相关文档内容:\n{context}"),
  43.         ("human", "{query}")
  44.     ])
  45.     # 将 LlamaIndex 查询引擎嵌入到 LangChain 链中
  46.     def retrieve_context(query):
  47.         response = query_engine.query(query)
  48.         return response.response
  49.     # 构建 LangChain 链路
  50.     chain = (
  51.         {"context": RunnablePassthrough() | retrieve_context, "query": RunnablePassthrough()}
  52.         | prompt
  53.         | ollama_llm.invoke
  54.     )
  55.     return chain
复制代码

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

  1. import streamlit as st
  2. # 初始化后端逻辑
  3. query_engine = build_knowledge_base()
  4. ollama_llm = OllamaLLM(model_name="llama2")  # 使用本地 Ollama 模型
  5. chain = build_langchain_chain(query_engine, ollama_llm)
  6. # Streamlit 应用界面
  7. st.markdown("请输入您的问题,我们将为您快速解答!")
  8. # 用户输入框
  9. user_query = st.text_input("您的问题:", "")
  10. if user_query:
  11.     # 显示加载动画
  12.     with st.spinner("正在为您查找答案..."):
  13.         # 调用后端逻辑生成回答
  14.         response = chain.invoke(user_query)
  15.     # 显示回答
  16.     st.subheader("回答:")
  17.     st.write(response)
  18.     # 显示上下文信息
  19.     st.subheader("参考内容:")
  20.     retrieved_context = query_engine.query(user_query).source_nodes
  21.     for i, node in enumerate(retrieved_context):
  22.         st.write(f"**来源 {i+1}:** {node.node.text[:200]}...")
复制代码

运行方式


  • 安装依赖:
    1. pip install llama-index langchain requests streamlit
    复制代码
  • 启动 Ollama:

    • 确保 Ollama 已安装并运行在当地(默认地点为 http://localhost:11434)。
    • 下载并加载目标模子(如 llama2):
      1. ollama pull llama2
      复制代码

  • 启动应用:

    • 将上述代码生存为 app.py。
    • 在终端运行以下下令:
      1. streamlit run app.py
      复制代码
    • 打开欣赏器访问 http://localhost:8501。


输出结果

界面截图


  • 首页结构:
  • 输入题目:

    • 用户输入题目:“公司2023年的重要产物有哪些?”

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

关键调解点分析


  • Ollama 模子调用:

    • 利用 requests.post 向 Ollama 的 /api/generate 接口发送哀求。
    • 参数包罗 model(模子名称)和 prompt(输入提示)。
    • 返回值为 JSON 格式,提取 response 字段作为模子输出。

  • LangChain 集成:

    • 自界说 OllamaLLM 类,提供与 LangChain 兼容的 invoke 方法。
    • 将 OllamaLLM.invoke 嵌入到链式调用中,替换原有的云端模子。

  • 性能优化:

    • 当地运行模子镌汰了网络延长,提拔了相应速率。
    • 可根据硬件性能选择符合的模子(如 llama2、mistral 等)。


应用场景


  • 离线情况:实用于无法访问云端服务的场景,如内网摆设。
  • 隐私掩护:数据完全在当地处置处罚,克制敏感信息走漏。
  • 低资本运行:无需付出云端服务费用,得当预算有限的项目。
通过将大模子调用从云端切换为当地 Ollama,我们实现了更高的机动性和隐私掩护。联合 LlamaIndex 和 LangChain 的强盛功能,以及 Streamlit 的友好界面,终极构建了一个高效、易用的智能客服应用。
如果你有任何疑问或想法,接待在品评区交换讨论!

总结

通过本案例,我们展示了怎样将 LlamaIndex 和 LangChain 的强盛功能与 Streamlit 的友好界面以及当地Ollama大模子API相联合,构建一个完备的智能客服应用。这种组合不光提拔了体系的功能性,还极大地改善了用户体验。
如果你有任何疑问或想法,接待在品评区交换讨论!
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表