搭建简易版的Rag系统
Rag系统搭建简易RAG检索增强生成搭建概述一、核心原理RAG 检索Retrieval 增强Augmentation 生成Generation不用微调大模型先从本地文档找相关内容 → 把内容塞进Prompt → 让大模型基于资料回答解决AI幻觉、知识库过时问题。二、整体流程文档加载与分块读取PDF/TXT/MD等文档切成小块Chunk避免上下文过长、检索不准。defsplit_into_chunks(doc_file):withopen(doc_file,r,encodingutf-8)asfile:contentfile.read()return[chunkforchunkincontent.split(\n\n)]chunkssplit_into_chunks(你的文档路径,)#将文档划分为几个片段# 导入完成后可以进行检查# for i,chunk in enumerate(chunks):# print(f[{i},{chunk})文本向量化 存入向量库用Embedding模型把文本块转成向量存入轻量向量库如FAISS、Chroma。# 如果运行不显示以下错误可以跳过这几行代码#(MaxRetryError(HTTPSConnectionPool(hosthuggingface.co, port443): Max retries exceeded with url: #/shibing624/text2vec-base-chinese/resolve/main/modules.json (Caused by #ConnectTimeoutError(HTTPSConnection(hosthuggingface.co, port443) at 0x1b570fb5f60, Connection to huggingface.co #timed out. (connect timeout10)))), (Request ID: 9a7e30b1-4e49-4bae-9f40-8036cc31cfa9)) thrown while requesting HEAD #https://huggingface.co/shibing624/text2vec-base-chinese/resolve/main/modules.json#Retrying in 1s [Retry 1/5].# 用以下代码的含义# 1. 用CPU跑不用显卡# 2. 走国内镜像下载模型更快更稳importos os.environ[CUDA_VISIBLE_DEVICES]-1os.environ[HF_ENDPOINT]https://hf-mirror.com# 从以下这几行开始写fromsentence_transformersimportSentenceTransformer embedding_modelSentenceTransformer(shibing624/text2vec-base-chinese)defembed_chunk(chunk):embeddingembedding_model.encode(chunk)returnembedding.tolist() 进行测试 test_embedding embed_chunk(测试内容) print(len(test_embedding)) print(test_embedding) 用户提问→相似度检索用户问题也转向量在向量库召回最相似的N个文档片段。importchromadb chromadb_clientchromadb.EphemeralClient()#创建临时保存chromadb_collectionchromadb_client.get_or_create_collection(namedefault)defsave_embedding(chunk,embedding):# 保存块与之对应的embeddingids[str(i)foriinrange(len(chunk))]chromadb_collection.add(documentschunk,embeddingsembeddings,idsids)save_embedding(chunks,embeddings)defretrieve(query,top_k):# 选出相似度较高的前top_k个片段query_embeddingembed_chunk(query)resultchromadb_collection.query(query_embeddings[query_embedding],n_resultstop_k)returnresult[documents][0]query这篇文章的主旨大意是什么# 用户提出的问题receive_chunksretrieve(query,5)#找到整个关键片段# 查看相似的片段fori,chunkinenumerate(receive_chunks):print(f{i},{chunk}\n)fromsentence_transformersimportCrossEncoderdefrerank(quary,receive_chunks,top_k):#给找到的关键字重新排序在选出关键片段cross_encodeCrossEncoder(cross-encoder/mmarco-mMiniLMv2-L12-H384-v1)pairs[(quary,chunk)forchunkinreceive_chunks]scorescross_encode.predict(pairs)chunk_with_score_list[(chunk,score)forchunk,scoreinzip(receive_chunks,scores)]chunk_with_score_list.sort(keylambdapairs:pairs[1],reverseTrue)return[chunkforchunk,_inchunk_with_score_list][:top_k]rerank_chunksrerank(query,receive_chunks,3)# 查看相思的片段fori,chunkinenumerate(rerank_chunks):print(f[{i}]{chunk}\n)构造Prompt→大模型生成答案把问题检索到的片段拼成提示词传给大模型生成回答。fromollamaimportchat#调用大模型给出作答defgenerate(query,chunks):chunks_content\n\n.join(chunks)promptf 你是一个知识助手请根据用户的问题和下列产生的片段生成准确的回答。 用户问题:{query}相关片段:{chunks_content}请基于上述内容作答不要编造信息print(f{prompt}\n\n---\n)responsechat(modelqwen2.5:0.5b,messages[{role:user,content:prompt}])returnresponse[message][content]answergenerate(query,chunks)print(answer)#做出回答