基于LangChain 开发RAG

说明:本文主要是基于LangChain开发的RAG示例

使用的大模型是:千问大模型

基于 LangChain 框架结合阿里云通义千问大模型构建 RAG(检索增强生成)系统,核心流程通常包含:文档加载 → 文本切分 → 向量化存储 → 检索器构建 → 问答链编排。

一,环境搭建与依赖安装

首先,在终端执行以下命令安装所需的依赖包:

pip install langchain langchain-community langchain-text-splitters chromadb dashscope python-dotenv

 安装完成如图:

image

 

 二,配置环境变量

DASHSCOPE_API_KEY=你的通义千问API密钥

  

 

3,完整demo 代码:

你可以将以下代码保存为 rag_demo.py,并在同目录下准备一个名为 example.txt 的测试文档:

import os
from dotenv import load_dotenv
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_classic.chains import RetrievalQA
from langchain_community.llms import Tongyi

# 1. 加载环境变量
load_dotenv()
api_key = os.getenv("DASHSCOPE_API_KEY")

def basic_rag_flow():
    # 2. 加载文档(确保文本文件为 utf-8 编码)
    loader = TextLoader("example.txt", encoding='utf-8')
    documents = loader.load()
    
    # 3. 分割文档(将长文本切分为小块,避免超出模型上下文窗口)
    text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
    texts = text_splitter.split_documents(documents)
    
    # 4. 创建嵌入模型和向量存储(使用阿里云 text-embedding-v1 模型)
    embeddings = DashScopeEmbeddings(
        model="text-embedding-v1",
        dashscope_api_key=api_key
    )
    # 将文本向量化并存入本地轻量级向量数据库 Chroma
    vectorstore = Chroma.from_documents(texts, embeddings)
    
    # 5. 构建检索器
    retriever = vectorstore.as_retriever()
    
    # 6. 创建 RAG 链(使用通义千问大模型)
    llm = Tongyi(
        model_name="qwen-max",  # 也可替换为 "qwen-plus" 或 "qwen-turbo"
        api_key=api_key,
        temperature=0.1
    )
    qa_chain = RetrievalQA.from_chain_type(
        llm=llm,
        chain_type="stuff",
        retriever=retriever,
        return_source_documents=True  # 可选:返回参考文档片段
    )
    
    # 7. 循环接收问题并输出结果
    while True:
        query = input("请输入问题(输入1退出):").strip()
        if query == "1":
            print("已退出问答")
            break
        if not query:
            print("问题不能为空")
            continue

        result = qa_chain.invoke({"query": query})
        print("问题:", query)
        print("回答:", result["result"])

    return qa_chain

if __name__ == "__main__":
    basic_rag_flow()

  4,核心逻辑解析

文本切分(Chunking):大模型有上下文长度限制,且长文本直接检索效率低,通过CharacterTextSplitter将文档切分为小块(如1000字符),能够检索更精准;

向量化(Embeddings): DashScopeEmbeddings 会将切分后的文本转化为高维向量,当用户提问时,问题也会被转为向量,通过计算余弦相似度在Chroma数据库中找出相关的文本块。

问答链(QA Chain): RetrievalQA会自动将检索到的相关文本块和用户的问题拼接成prompt,发送给Tongyi大模型,最终生成基于文档内容的精准回答;

 

5,测试

image

 

posted @ 2026-09-09 14:13  明&天  阅读(15)  评论(0)    收藏  举报