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

https://python.langchain.com/api_reference/text_splitters/character/langchain_text_splitters.character.RecursiveCharacterTextSplitter.html

OneAPI-通过OpenAI API访问所有大模型

https://blog.csdn.net/liliang199/article/details/151393128

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐