首页 > 人工智能 > 人工智能 > LangChian实现最小可运行的 RAG示例解析
下面代码是一个可用的 LangChain + 阿里云通义千问 RAG 最小示例。其逻辑非常清晰,就是:
加载 → 切分 → 向量化 → 检索 → QA。
示例代码取自《AI Agent智能体开发实践》第8章
# -*- coding: utf-8 -*-
"""
Created on Thu Jul 24 21:03:45 2025
@author: liguo
"""
from langchain_community.document_loaders import TextLoader
from langchain_community.indexes import VectorstoreIndexCreator
from langchain_text_splitters import CharacterTextSplitter
from langchain_community.embeddings import DashScopeEmbeddings # 👈 替换 QwenEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain_community.llms import Tongyi # Qwen
import os
# 设置阿里云 DashScope API Key(必须)
api_key=os.getenv("DASHSCOPE_API_KEY") # 👈 替换为你自己的 API Key
def basic_rag_flow():
# 1. 加载文档 —— 修复编码问题
loader = TextLoader("example.txt", encoding='utf-8')
documents = loader.load()
# 2. 分割文档
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
# 3. 创建嵌入和向量存储(使用通义千问的 Embedding 模型)
embeddings = DashScopeEmbeddings(
model="text-embedding-v1", # 阿里云提供的嵌入模型
dashscope_api_key=os.environ["DASHSCOPE_API_KEY"]
)
vectorstore = Chroma.from_documents(texts, embeddings)
# 4. 构建检索器
retriever = vectorstore.as_retriever()
# 5. 创建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 # 可选:返回参考文档
)
# 6. 执行查询并输出结果
query = "请总结文档的主要内容"
result = qa_chain.invoke({"query": query}) # 👈 注意:新版推荐用 invoke
print("问题:", query)
print("回答:", result["result"])
# 可选:打印参考文档
# for doc in result["source_documents"]:
# print("参考文档片段:", doc.page_content[:200], "...")
return qa_chain
# 调用函数以执行流程
if __name__ == "__main__":
basic_rag_flow()
“基于本地文档内容回答问题”
用户问题 ↓ 从文档中检索相关内容 ↓ 把相关内容交给大模型 ↓ 生成基于事实的回答
basic_rag_flow() ├─ 1. 加载文档 ├─ 2. 切分文档 ├─ 3. 向量化 + 存入向量库 ├─ 4. 构建检索器 ├─ 5. 构建 RAG 问答链 └─ 6. 执行查询
from langchain_community.document_loaders import TextLoader from langchain_community.indexes import VectorstoreIndexCreator from langchain_text_splitters import CharacterTextSplitter from langchain_community.embeddings import DashScopeEmbeddings from langchain_community.vectorstores import Chroma from langchain.chains import RetrievalQA from langchain_community.llms import Tongyi
|
模块 |
作用 |
|---|---|
|
TextLoader |
读取本地文本 |
|
CharacterTextSplitter |
文本切分成块 |
|
DashScopeEmbeddings |
阿里云向量模型 |
|
Chroma |
向量数据库 |
|
RetrievalQA |
RAG 问答链 |
|
Tongyi |
通义千问 LLM |
loader = TextLoader("example.txt", encoding='utf-8')
documents = loader.load()
example.txtDocument对象列表page_content = 文本内容
metadata = {"source": "example.txt"}text_splitter = CharacterTextSplitter( chunk_size=1000, chunk_overlap=0 ) texts = text_splitter.split_documents(documents)
texts = [ Document(...), Document(...), Document(...) ]
embeddings = DashScopeEmbeddings( model="text-embedding-v1", dashscope_api_key=os.environ["DASHSCOPE_API_KEY"] )
text-embedding-v1vectorstore = Chroma.from_documents(texts, embeddings)
retriever = vectorstore.as_retriever()
给定一个问题 → 返回最相关的文档片段
问题 → 向量化 → 相似度匹配 → Top-K 文档
llm = Tongyi( model_name="qwen-max", api_key=api_key, temperature=0.1 )
qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever, return_source_documents=True )
RetrievalQA做了什么?用户输入问题 ↓ Retriever 找相关文档 ↓ 把问题和文档拼在一起 ↓ LLM 生成答案
chain_type="stuff"的含义:query = "请总结文档的主要内容"
result = qa_chain.invoke({"query": query})
根据以下内容回答问题: [文档片段1] [文档片段2] 问题:请总结文档的主要内容
|
能力 |
是否演示 |
|---|---|
|
私有数据接入 |
✅ |
|
文本向量化 |
✅ |
|
向量检索 |
✅ |
|
大模型增强生成 |
✅ |
|
LangChain 标准用法 |
✅ |
|
阿里云通义千问集成 |
✅ |
这个示例演示了:如何使用 LangChain + 阿里云 DashScope,构建一个基于本地文档的检索增强生成(RAG)问答系统。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/18841117/viewspace-3117278/ ,如需转载,请注明出处,否则将追究法律责任。