langchain基于markdown文档构建RAG系统
markdown是一种轻量级标记语言,用于使用纯文本编辑器创建格式化文本。在这里将介绍如何将 markdown文档加载到 langChain Document对象中,并构建RAG系统。这里假设langchain框架已经安装,具体过程参考。
markdown是一种轻量级标记语言,用于使用纯文本编辑器创建格式化文本。
在这里将介绍如何将 markdown
文档加载到 langChain Document对象中,并构建RAG系统。
这里假设langchain框架已经安装,具体过程参考
https://blog.csdn.net/liliang199/article/details/152930380
1 环境准备
这里参考网络资料,构建langchain面向markdown文档的RAG知识库环境准备。
1.1 unstructured
langchain以来unstruct[md]支持markdown文档的导入和划分,所以需要先安装unstructured[md]。
pip install unstructured[md] nltk -i https://pypi.tuna.tsinghua.edu.cn/simple
unstructrued依赖nltk处理文档,所以还需要安装nltk。
nltk自动下载nltk_data数据可能会遇到网络问题,需要手工下载nltk_data数据,具体过程参考
https://blog.csdn.net/liliang199/article/details/152803902
1.2 Ollama
采用ollama embedding模型的访问,模型为bge-m3
本地采用docker部署ollama,命令如下
docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
模型pull过程示例如下
ollama pull bge-m3
1.3 OneAPI
langchain主要采用openai接口访问大模型,然而面临访问受限的问题。
OneAPI是LLM OpenAI接口的管理、分发系统,通过标准的OpenAI API访问所有的大模型。
支持Deepseek、阿里通义、百度千帆、火山豆包、腾讯元宝等大部分LLM。
这里采用docker方式部署One API,命令如下
docker run --name one-api -d --restart always -p 3000:3000 -e TZ=Asia/Shanghai -v /data/apps/llm/oneapi/data/one-api:/data justsong/one-api
在OneAPI配置对Deepseek r1的访问,支持本地以openai接口方式访问。具体配置过程参考
https://blog.csdn.net/liliang199/article/details/151393128
2 构建测试
环境构建好之后,就可以进行测试了,过程分别为知识库输入文档docuemt.md。
这里document来源于llama2.pdf,原始链接如下
https://arxiv.org/pdf/2307.09288
2.1 rag 输入
langchain将markdown格式的输入document.md导入,并并行分块。
from langchain_ollama import OllamaEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain_community.document_loaders import UnstructuredMarkdownLoader
from dotenv import load_dotenv,find_dotenv
_ = load_dotenv(find_dotenv(),verbose=True)
from langchain_community.document_loaders import UnstructuredMarkdownLoader
from langchain_core.documents import Document
markdown_path = "data/document.md"
loader = UnstructuredMarkdownLoader(markdown_path)
pages = loader.load_and_split()
print(f"pages: {len(pages)}")
# 文档切分
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=300,
chunk_overlap=100,
length_function=len,
add_start_index=True,
)
texts = text_splitter.create_documents(
[page.page_content for page in pages[:]]
)
2.2 rag向量化
这里使用OllamaEmbeedings向量化知识库文档。
# 灌库
embeddings = OllamaEmbeddings(model="bge-m3")
db = FAISS.from_documents(texts, embeddings)
# 检索 top-50 结果
retriever = db.as_retriever(search_kwargs={"k": 50})
2.3 在线查询
知识库准备好后,这里使用Deepseek R1大模型,完成对知识库查询结果的归纳和总结。
import os
os.environ['OPENAI_API_KEY'] = "sk-xxxx" # LLM大模型令牌
os.environ['OPENAI_BASE_URL'] = "http://llm_provider_url" #LLM大模型部署地址
from langchain.schema.output_parser import StrOutputParser
from langchain.schema.runnable import RunnablePassthrough
from langchain.prompts import (
ChatPromptTemplate,
HumanMessagePromptTemplate,
SystemMessagePromptTemplate,
)
# Prompt模板
template = """Answer the question based only on the following context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
llm = ChatOpenAI(model="deepseek-r1")
# Chain
rag_chain = (
{"question": RunnablePassthrough(), "context": retriever}
| prompt
| llm
| StrOutputParser()
)
output = rag_chain.invoke("Llama 2有多少参数?")
print(output)
reference
---
如何加载Markdown
https://python.langchain.ac.cn/docs/how_to/document_loader_markdown/
如何基于OneAPI构建langchain RAG系统
https://blog.csdn.net/liliang199/article/details/152930380
LLM时代基于unstructured解析非结构化html
https://blog.csdn.net/liliang199/article/details/152803902
RecursiveCharacterTextSplitter
OneAPI-通过OpenAI API访问所有大模型
https://blog.csdn.net/liliang199/article/details/151393128
更多推荐
所有评论(0)