当前位置: 首页 > news >正文

【langchain】构建简单检索问答链

文章目录

  • 说明
  • 1 加载向量数据库(Chroma + textV4Embeddings)
  • 2 构建简单检索链
    • 2.1 定义向量检索器(RunnableLamdba)
    • 2.2 构建简单检索链(管道机制)
  • 3 定义LLM(以 qwen-plus 为例)
  • 4 定义提示词模板(PromptTemplate)
  • 4 组装完整的简单检索问答链(RAG)(使用LCEL语法连接各种组件)
  • 测试

本文内容的复现需要一定的基础。在本系列文章中,已单独出过plog的部分,将不再赘述,如有不懂,请移步专栏查找。点击直通车>>>>

说明

LangChain 是一个用于开发基于大模型(LLM)应用的框架,它提供了丰富的工具和组件来简化 LLM 应用的构建过。

核心概念

  1. Components 组件。提供各种基础构建块,如:
    PromptTemplate:用于创建和管理提示词的模板
    LLMChatModel:封装各种大模型的接口
    OutputParser:解析模型输出
    Retriever:实现信息检索功能功能

  2. Chains(链)
    将多个组件组合成可执行的工作流(Runable类的才行)
    支持顺序执行、并行执行(RunnableParallel)等不同模式
    LCEL(全称:LangChain Expression Language)提供了简洁的链式调用语法

  3. Data Connection(数据连接)
    提供与外部数据源的连接能力
    包括文档加载其、文本分割器、向量存储集成等
    支持检索增强生成(RAG,retrieval-Augmented Generation)模式

主要优势

  • 模块化设计:各个组件可以灵活组合
  • 标准化接口:统一的 API 简化了不同模型和服务的集成
  • 内置最佳实践:集成了 LLM 应用开发的最佳实践
  • 扩展性强:支持自定义组件和第三方集成

1 加载向量数据库(Chroma + textV4Embeddings)

该部分详解见【langchain】构建向量数据库并存入数据,以chroma为例

实例化数据库,并告诉数据库采用的嵌入模型

from demo import textV4Embeddings
from langchain.vectorstores import Chroma
import osos.getenv("DASHSCOPE_API_KEY")  # 加载环境变量(前提是已设置环境变量)
persist_directory = "D:\dev_gitee\embedding-example\data_base\\vector_db"  # 数据库地址"""所使用的嵌入模型。这个需要与数据库中的向量数据保持一致"""
embeddings = textV4Embeddings()
"""加载本地db"""
vectorstore = Chroma(persist_directory=persist_directory,embedding_function=embeddings)

2 构建简单检索链

2.1 定义向量检索器(RunnableLamdba)

"""核心代码"""
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})  # 关键语句:as_retriever()转为向量检索器,search_kwargs={"k": 3}指定返回前3相似度的向量数量"""测试代码:问题检索"""
question = "什么是prompt engineering?"
docs = retriever.invoke(question)  # 返回类型依旧是 List[document]

2.2 构建简单检索链(管道机制)

从 2.1 的输出知道,检索器的检索结果是List类型,后续使用需要将每个Documentpage_content部分进行组装合并。即,拼接docs[i].page_content

  • 定义一个合并器
from langchain_core.runnables import RunnableLambdadef combine_docs(docs):return "\n\n".join([doc.page_content for doc in docs])
combiner = RunnableLambda(func=combine_docs)  # 创建一个可运行的组件,合并器【问答链每个部分都需要属于Runnable大类】
  • 组装检索器和合并器
retriever_chain = retriever | combiner  # 将检索器和合并器进拼接
retriever_chain.invoke(question)

3 定义LLM(以 qwen-plus 为例)

LLM实例化仅供参考,不同平台以及模型有所差异。

import os
from langchain_openai import ChatOpenAI"""核心代码"""
chatLLM = ChatOpenAI(api_key=os.getenv("DASHSCOPE_API_KEY"),base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",model="qwen-plus",temperature=0,)"""测试代码:问答模拟"""
messages=[{"role": "user", "content": "请你自我介绍一下自己!"}]
chatLLM.invoke(messages)  # 如果只要内容部分,就写chatLLM.invoke(messages).content

4 定义提示词模板(PromptTemplate)

from langchain_core.prompts import PromptTemplate"""模板格式"""
template="使用以下上下文来回答最后的问题。如果你不知道答案,就说你不知道,不要试图编造答案。最多使用三句话。尽量使答案简明扼要。请你在回答的最后说“谢谢你的提问!”。{context}问题:{input}"
"""将template 通过PromptTemplate 转换为prompt,使得可以在LCEL中使用"""
prompt = PromptTemplate.from_template(template)

4 组装完整的简单检索问答链(RAG)(使用LCEL语法连接各种组件)

这里就组装前面所有的东西。

from langchain_core.runnables import RunnablePassthrough,  RunnableParallel
from langchain_core.output_parsers import StrOutputParser"""检索问答链:
将之前的检索链retriever_chain作为context,使用RunnablePassthrough存储用户问题作为prompt的input(使用RunnableParallel并行处理)
将prompt给llm
StrOutputParser()将模型的输出解析为纯字符串格式移除任何额外的格式或元数据,只返回干净的回答文本"""
qa_chain = (RunnableParallel({"context": retriever_chain, "input": RunnablePassthrough()})| prompt| chatLLM| StrOutputParser())

RunnablePassthrough
     功能:输入什么就输出什么
      用途:通常用于在链中传递原始输入或保持某些数据不变
     工作方式:接收输入并原样输出,常用于链的分支或保持上下文
RunnableParallel
     功能:并行执行多个可运行组件
     用途:同时运行多个操作,提高效率
     工作方式:接收输入后,将输入分发给多个组件并行处理,然后合并结果

测试

question_1 = "什么是南瓜书?"
print("大模型+知识库后的回答:",qa_chain.invoke(question_1))question_2 = "prompt engineering for Developer是谁写的?"
print("大模型+知识库后的回答:",qa_chain.invoke(question_2))

下篇文章,讲解构建带聊天记录的检索问答链。


文章转载自:

http://Xxs0gxT7.xcszL.cn
http://R7YUtOX5.xcszL.cn
http://7EUceV5h.xcszL.cn
http://NWgTN0DJ.xcszL.cn
http://rMtuMyg5.xcszL.cn
http://h4WkBOoH.xcszL.cn
http://2BoJtzTY.xcszL.cn
http://Nk1cXZhd.xcszL.cn
http://pt7nWaos.xcszL.cn
http://plcvnsCc.xcszL.cn
http://Cvq7P2Cx.xcszL.cn
http://L4WLXw27.xcszL.cn
http://VtXLlcix.xcszL.cn
http://pU5L4amP.xcszL.cn
http://hiE5tUos.xcszL.cn
http://swgelaY4.xcszL.cn
http://rb7Ri1nU.xcszL.cn
http://lOC6UcwH.xcszL.cn
http://f4Beazf0.xcszL.cn
http://ywR7wIXO.xcszL.cn
http://qS031yEw.xcszL.cn
http://DlwQekvX.xcszL.cn
http://45sSMMVA.xcszL.cn
http://T9UbPBYF.xcszL.cn
http://WpNsoO41.xcszL.cn
http://NhRswX13.xcszL.cn
http://amOpA2nF.xcszL.cn
http://bC1bMVy8.xcszL.cn
http://uVjt5WSU.xcszL.cn
http://2ZRxajAF.xcszL.cn
http://www.dtcms.com/a/385694.html

相关文章:

  • 简单的数组
  • ENVI系列教程(四)——图像几何校正
  • 数据结构基础--散列表
  • 【Redis】-- 主从复制
  • 输入1.8V~5.5V 输出28V DCDC升压芯片TLV61046A
  • Windows 上安装 FFmpeg 8.0(2025 版)——从“手动解压”到“一条命令”的进化之路
  • 红黑树(RBTree)知识总结
  • 若依框架前端通过 nginx docker 镜像本地运行
  • 二十、瑞萨RZT2N2 PROFINET SDK正式发布
  • SpringAI框架接入Deepseek和豆包实现智能聊天
  • 江协科技STM32课程笔记(一) —GPIO
  • 江协科技STM32课程笔记(二)—外部中断EXTI
  • 科技信息差(9.15)
  • 龙珠KS6 10.5T矿机评测:性能、功耗、噪音与冷却分析
  • 打工人日报#20250915
  • 新一代车载诊断框架简介
  • 05-索引-性能分析
  • 【数据工程】 2. Unix 基础与文件操作
  • 第四课、 TypeScript 中 Cocos 的生命周期
  • 联邦学习论文分享:DPD-fVAE
  • Pairwise排序损失:让机器学会排序的艺术
  • 硬件开发—IMX6ULL裸机—UART通信
  • 蓝牙上位机开发指南
  • 【课堂笔记】复变函数-1
  • 谈谈人大金仓数据库
  • C#调用钉钉API发送通知教程
  • 电子电气架构 --- 产线EOL为何需要智能升级?
  • 无人机姿态控制系统详解与实现
  • 7.Redis 主从复制(重在理解)
  • 从零搭建RAG应用:跳过LangChain,掌握文本分块、向量检索、指代消解等核心技术实现