哪个网站做美食视频软件西安专业网站建设公司排名
2026/1/1 23:05:19 网站建设 项目流程
哪个网站做美食视频软件,西安专业网站建设公司排名,wordpress个人博客实战,自己做的网站怎样让百度搜到【LLM实操系列05】RAG实战#xff1a;知识库问答系统从0到生产 在开始之前#xff0c;建议先完成第03篇#xff08;API调用#xff09;和第04篇#xff08;Prompt技巧#xff09;的学习。你需要理解Embedding#xff08;文本向量化#xff09;的基本原理#xff0c;并…【LLM实操系列05】RAG实战知识库问答系统从0到生产在开始之前建议先完成第03篇API调用和第04篇Prompt技巧的学习。你需要理解Embedding文本向量化的基本原理并安装langchain、chromadb等依赖。10分钟实现最简RAG什么是RAG检索增强生成 搜索相关文档 结合文档回答问题Embedding是什么Embedding将文本转换为高维向量表示。语义相似的文本会有相似的向量这使得我们可以用它来计算文本相似度和进行语义搜索。最小可运行代码# pip install langchain chromadb openai tiktokenfromlangchain.embeddingsimportOpenAIEmbeddingsfromlangchain.vectorstoresimportChromafromlangchain.chat_modelsimportChatOpenAIfromlangchain.chainsimportRetrievalQA# 1. 准备文档docs[Python是1991年发布的编程语言,JavaScript主要用于网页开发,Rust注重内存安全和性能]# 2. 创建向量库embeddingsOpenAIEmbeddings()vectordbChroma.from_texts(docs,embeddings)# 3. 创建RAG链llmChatOpenAI(temperature0)qaRetrievalQA.from_chain_type(llmllm,retrievervectordb.as_retriever())# 4. 提问answerqa.run(Python是什么时候发布的)print(answer)# 输出Python是1991年发布的生产级RAG架构完整实现importosfromtypingimportList,Dict,AnyimportnumpyasnpfromdataclassesimportdataclassdataclassclassDocument:文档数据结构content:strmetadata:Dict[str,Any]embedding:np.ndarrayNoneclassProductionRAG:生产环境RAG系统def__init__(self,embedding_modeltext-embedding-ada-002,llm_modelgpt-3.5-turbo,vector_dbchroma):# 初始化组件self.embeddingsOpenAIEmbeddings(modelembedding_model)self.llmChatOpenAI(modelllm_model,temperature0)# 向量数据库ifvector_dbchroma:self.vectordbChroma(persist_directory./chroma_db,embedding_functionself.embeddings)elifvector_dbfaiss:fromlangchain.vectorstoresimportFAISS self.vectordbFAISS.load_local(./faiss_index,self.embeddings)# 文档处理器self.text_splitterself._init_splitter()def_init_splitter(self):智能文档分块fromlangchain.text_splitterimportRecursiveCharacterTextSplitterreturnRecursiveCharacterTextSplitter(chunk_size500,# 块大小chunk_overlap100,# 重叠separators[\n\n,# 段落\n,# 行。,# 句号,# 感叹号,# 问号,# 分号,# 逗号 # 空格])defadd_documents(self,file_paths:List[str]):批量添加文档fromlangchain.document_loadersimport(PDFLoader,TextLoader,UnstructuredWordDocumentLoader,CSVLoader)loaders{.pdf:PDFLoader,.txt:TextLoader,.docx:UnstructuredWordDocumentLoader,.csv:CSVLoader}all_docs[]forpathinfile_paths:extos.path.splitext(path)[1].lower()loader_classloaders.get(ext,TextLoader)loaderloader_class(path)# 加载并分块docsloader.load()splitsself.text_splitter.split_documents(docs)all_docs.extend(splits)# 添加到向量库self.vectordb.add_documents(all_docs)print(f已添加{len(all_docs)}个文档块)defsearch(self,query:str,k3,use_rerankTrue):增强搜索# 1. 初步检索docsself.vectordb.similarity_search(query,kk*2ifuse_rerankelsek)# 2. 重排序可选ifuse_rerank:docsself._rerank(query,docs,top_kk)returndocsdef_rerank(self,query:str,docs:List,top_k:int):使用CrossEncoder重排序fromsentence_transformersimportCrossEncoder# 加载重排序模型首次会下载rerankerCrossEncoder(cross-encoder/ms-marco-MiniLM-L-6-v2)# 计算相关性分数pairs[[query,doc.page_content]fordocindocs]scoresreranker.predict(pairs)# 按分数排序doc_scoreslist(zip(docs,scores))doc_scores.sort(keylambdax:x[1],reverseTrue)return[docfordoc,_indoc_scores[:top_k]]defquery(self,question:str,use_memoryFalse):智能问答# 检索相关文档docsself.search(question)# 构建上下文context\n\n.join([d.page_contentfordindocs])# 生成答案ifuse_memory:fromlangchain.memoryimportConversationBufferWindowMemory memoryConversationBufferWindowMemory(k3)fromlangchain.chainsimportConversationalRetrievalChain chainConversationalRetrievalChain.from_llm(llmself.llm,retrieverself.vectordb.as_retriever(),memorymemory)responsechain({question:question})else:# 自定义Promptpromptf 基于以下信息回答问题。如果信息不足请说根据提供的信息无法回答。 信息{context}问题{question}回答responseself.llm.predict(prompt)return{answer:response,sources:[{content:d.page_content,metadata:d.metadata}fordindocs]}向量数据库选型对比表数据库性能易用性成本适用场景Chroma⭐⭐⭐⭐⭐⭐⭐⭐免费原型/小规模FAISS⭐⭐⭐⭐⭐⭐⭐⭐免费单机高性能Pinecone⭐⭐⭐⭐⭐⭐⭐⭐$70/月SaaS云服务Weaviate⭐⭐⭐⭐⭐⭐⭐⭐免费云混合搜索Milvus⭐⭐⭐⭐⭐⭐⭐⭐免费大规模生产快速集成代码# 1. Chroma最简单fromlangchain.vectorstoresimportChroma vectordbChroma.from_texts(texts,embeddings,persist_directory./db)# 2. FAISS最快fromlangchain.vectorstoresimportFAISS vectordbFAISS.from_texts(texts,embeddings)vectordb.save_local(./faiss_index)# 3. Pinecone云服务importpineconefromlangchain.vectorstoresimportPinecone pinecone.init(api_keyxxx,environmentus-east-1)vectordbPinecone.from_texts(texts,embeddings,index_namemy-index)# 4. Weaviate混合搜索fromlangchain.vectorstoresimportWeaviateimportweaviate clientweaviate.Client(http://localhost:8080)vectordbWeaviate(client,index_nameDocuments,text_keycontent)性能优化技巧1. 智能分块策略defsmart_chunking(text:str,max_tokens500):基于语义的智能分块importtiktoken enctiktoken.encoding_for_model(gpt-3.5-turbo)# 按段落分割paragraphstext.split(\n\n)chunks[]current_chunk[]current_tokens0forparainparagraphs:para_tokenslen(enc.encode(para))ifcurrent_tokenspara_tokensmax_tokens:# 保存当前块ifcurrent_chunk:chunks.append(\n\n.join(current_chunk))current_chunk[para]current_tokenspara_tokenselse:current_chunk.append(para)current_tokenspara_tokensifcurrent_chunk:chunks.append(\n\n.join(current_chunk))returnchunks2. 混合检索classHybridSearch:结合关键词和语义搜索def__init__(self,vectordb):self.vectordbvectordbfromrank_bm25importBM25Okapi self.bm25Noneself.corpus[]defindex_documents(self,documents):构建双索引# 向量索引self.vectordb.add_documents(documents)# BM25索引tokenized_corpus[doc.page_content.split()fordocindocuments]self.bm25BM25Okapi(tokenized_corpus)self.corpusdocumentsdefsearch(self,query:str,k5):混合搜索# 语义搜索semantic_resultsself.vectordb.similarity_search(query,kk)# 关键词搜索tokenized_queryquery.split()bm25_scoresself.bm25.get_scores(tokenized_query)top_indicesnp.argsort(bm25_scores)[-k:][::-1]keyword_results[self.corpus[i]foriintop_indices]# 合并去重seenset()final_results[]fordocinsemantic_resultskeyword_results:ifdoc.page_contentnotinseen:seen.add(doc.page_content)final_results.append(doc)iflen(final_results)k:breakreturnfinal_results3. 缓存优化fromfunctoolsimportlru_cacheimporthashlibclassCachedRAG:带缓存的RAG系统def__init__(self,rag_system):self.ragrag_system self.cache{}lru_cache(maxsize1000)def_get_embedding_cached(self,text:str):缓存Embeddingreturnself.rag.embeddings.embed_query(text)defquery_with_cache(self,question:str):缓存查询结果# 生成查询键query_hashhashlib.md5(question.encode()).hexdigest()# 检查缓存ifquery_hashinself.cache:print(Cache hit!)returnself.cache[query_hash]# 执行查询resultself.rag.query(question)# 保存缓存self.cache[query_hash]resultreturnresult实战部署Docker部署# docker-compose.ymlversion:3.8services:rag-api:build:.ports:-8000:8000environment:-OPENAI_API_KEY${OPENAI_API_KEY}volumes:-./data:/app/data-./vectordb:/app/vectordbchromadb:image:chromadb/chromaports:-8001:8000volumes:-./chroma_data:/chroma/chromaFastAPI服务fromfastapiimportFastAPI,UploadFile,FilefrompydanticimportBaseModelimportuvicorn appFastAPI()rag_systemProductionRAG()classQuery(BaseModel):question:strk:int3app.post(/upload)asyncdefupload_document(file:UploadFileFile(...)):上传文档# 保存文件file_pathf./uploads/{file.filename}withopen(file_path,wb)asf:contentawaitfile.read()f.write(content)# 添加到RAGrag_system.add_documents([file_path])return{message:文档已上传并索引}app.post(/query)asyncdefquery(q:Query):查询接口resultrag_system.query(q.question,kq.k)returnresultapp.get(/stats)asyncdefstats():系统统计return{total_documents:len(rag_system.vectordb.get()[ids]),model:gpt-3.5-turbo,embedding_model:text-embedding-ada-002}if__name____main__:uvicorn.run(app,host0.0.0.0,port8000)常见问题解决问题原因解决方案回答不准确检索质量差优化分块大小增加overlap速度慢每次都计算embedding使用缓存批量处理成本高调用API频繁本地embedding模型文档更新困难没有版本管理增加metadata支持增量更新答案幻觉上下文不足增加检索数量验证答案

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询