LangChain + Elasticsearch:构建强大 RAG 应用的实战指南
本文带你系统性掌握如何基于 LangChain 框架与 Elasticsearch 向量数据库,搭建高效稳定的 RAG(Retrieval-Augmented Generation)应用。通过详细图解与代码实战,从文档加载、向量化、存储、检索到生成逐步实现,适用于企业知识库、金融问答、政务助手等场景。
📚 目录
- 什么是 RAG?为什么选择 LangChain + Elasticsearch?
- 系统架构与工作流程图解
- 技术选型与环境准备
- 步骤一:加载与切分文档
- 步骤二:生成向量并存储至 Elasticsearch
- 步骤三:构建 LangChain 检索器
- 步骤四:集成 LLM 进行问答生成
- 实战完整代码示例
- 常见问题与优化建议
- 总结与延伸应用
一、什么是 RAG?为什么选择 LangChain + Elasticsearch?
✅ 什么是 RAG(Retrieval-Augmented Generation)?
RAG = 检索增强生成
核心思想:将检索到的文档作为上下文输入大模型,以提高问答的准确性与可信度。
传统 LLM 的问题:
- 无法访问最新知识
- 上下文受限
- 胡说八道(hallucination)
RAG 架构提供了解决方案:
用户问题 → 检索相关文档 → 携带文档上下文 → LLM 生成回答
✅ 为什么选 LangChain + Elasticsearch?
能力 | LangChain | Elasticsearch |
---|---|---|
向量检索封装 | ✅ | ✅ |
Chunk 文档切分 | ✅ | ❌ |
向量存储 | 支持多后端 | 原生支持 HNSW 向量检索 |
LLM 调用 | 支持 OpenAI、Qwen、glm 等 | ❌ |
适合大型文档 | ✅ | ✅ |
二、系统架构与工作流程图解(文字图)
+------------------------+
| 用户问题输入 |
+-----------+------------+
|
v
[嵌入模型encode问题向量]
|
v
+-------------------+------------------+
| Elasticsearch 向量索引库搜索 TopK |
+-------------------+------------------+
|
返回匹配段落(上下文文档集合)
|
v
[LangChain + LLM 将文档作为上下文]
|
v
+------------------+
| 生成最终回答 |
+------------------+
三、技术选型与环境准备
🧰 Python 库安装
pip install langchain elasticsearch sentence-transformers openai
可选:
- 使用本地 LLM:如
qwen
,chatglm
,llama-cpp
- Elasticsearch 要求:版本 ≥ 8.x
四、步骤一:加载与切分文档(LangChain 文档加载器)
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 读取文档
loader = TextLoader("docs/社保政策.txt", encoding="utf-8")
documents = loader.load()
# 切分为小段落(chunk)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
docs = text_splitter.split_documents(documents)
五、步骤二:生成向量并存储至 Elasticsearch
嵌入模型初始化
from langchain.embeddings import HuggingFaceEmbeddings
embedding = HuggingFaceEmbeddings(
model_name="BAAI/bge-base-zh",
model_kwargs={"device": "cpu"}
)
向 Elasticsearch 存储向量数据
from langchain.vectorstores import ElasticsearchStore
vectorstore = ElasticsearchStore.from_documents(
documents=docs,
embedding=embedding,
es_url="http://localhost:9200",
index_name="rag_docs"
)
💡 默认使用 dense_vector
类型,可自动创建向量索引结构。
六、步骤三:构建 LangChain 检索器
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 5}
)
此 retriever 会接收用户输入,自动生成向量并从 Elasticsearch 检索前 5 个相关段落。
七、步骤四:集成 LLM 进行问答生成
你可以选择调用:
- OpenAI GPT-4
- 通义千问 Qwen
- 本地 LLM(如 ChatGLM)
示例:使用 OpenAI Chat 模型
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=retriever,
return_source_documents=True
)
八、实战完整代码示例(End-to-End)
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import ElasticsearchStore
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
# 加载与切分
loader = TextLoader("docs/社保政策.txt", encoding="utf-8")
docs = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50).split_documents(loader.load())
# 向量化
embedding = HuggingFaceEmbeddings(model_name="BAAI/bge-base-zh")
# 存储到 Elasticsearch 向量数据库
vectorstore = ElasticsearchStore.from_documents(
documents=docs,
embedding=embedding,
es_url="http://localhost:9200",
index_name="rag_docs"
)
# 构建 RAG 检索器
retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 5})
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)
# 查询示例
query = "2024年北京市社保缴费上限是多少?"
result = qa_chain.run(query)
print("🔍 回答:", result)
九、常见问题与优化建议
问题 | 原因 | 建议 |
---|---|---|
向量不准确 | 嵌入模型不匹配领域 | 使用领域特化模型如 bge-finance |
检索不到相关文档 | chunk 过大、分段不合理 | 使用 Recursive 分段 + 重叠 |
查询慢 | 向量召回 + LLM 生成耗时 | 增加缓存层、减少 top-k |
Elasticsearch 查询为空 | 没有创建向量索引 | 使用 index_options: {"type": "hnsw"} 并确保文档入库 |
🔚 十、总结与延伸应用
模块 | 技术栈 |
---|---|
文档加载 | LangChain Loader |
文本分段 | RecursiveSplitter |
向量生成 | HuggingFace Embeddings(如 BGE) |
向量数据库 | Elasticsearch(支持 HNSW) |
LLM 问答 | ChatOpenAI / Qwen / ChatGLM |
应用场景 | 智能客服、政务问答、财税知识库、医学助手 |
✨ 延伸方向推荐
- 多文档上传 + 自动索引化服务
- 多模态 RAG(图像 + 文本)
- 双阶段检索(ANN + rerank)
- LangChain Expression Language(LCEL)流程控制
评论已关闭