ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

week10

week10 目标基于手头文件写了一个问答系统不需要网页能用代码做出回答就行方法任选即可解读读取本地文件 → 文本切分 → 向量化 → 检索相关内容 → 调用大模型生成答案。使用RAG方法。流程本地文件 ↓ Document Parsing ↓ 文本切分 Chunk ↓ Embedding ↓ 向量数据库/FAISS ↓ 用户问题 ↓ Query Embedding ↓ Top-K Retrieval ↓ 相关上下文 ↓ LLM ↓ 最终答案方案PythonSentence TransformersFAISSvLLM内容pip install sentence-transformers faiss-cpu openai pypdfimportpickleimportfaissimportnumpyasnpfromopenaiimportOpenAIfromsentence_transformersimport(SentenceTransformer)EMBEDDING_MODEL(BAAI/bge-small-zh-v1.5)LLM_MODEL(Qwen/Qwen2.5-1.5B-Instruct)TOP_K3embedding_model(SentenceTransformer(EMBEDDING_MODEL))indexfaiss.read_index(index/faiss.index)withopen(index/chunks.pkl,rb)asf:chunkspickle.load(f)clientOpenAI(base_url(http://localhost:8000/v1),api_keyEMPTY)defretrieve(question,top_k3):query_embedding(embedding_model.encode([question],normalize_embeddingsTrue))query_embeddingnp.asarray(query_embedding,dtypefloat32)scores,indices(index.search(query_embedding,top_k))results[]forscore,idxinzip(scores[0],indices[0]):results.append({score:float(score),chunk_id:int(idx),text:chunks[idx]})returnresultsdefanswer_question(question):resultsretrieve(question,TOP_K)context\n\n.join([(f[资料{i1}] fChunk{item[chunk_id]}\nf{item[text]})fori,iteminenumerate(results)])promptf 你是一个本地文件问答助手。 请严格根据下面提供的资料回答问题。 要求 1. 只能依据提供的资料回答。 2. 不要编造资料中不存在的信息。 3. 如果资料中无法找到答案请回答 根据当前文件内容无法确定。 4. 回答尽量简洁、清晰。 5. 如果可以请说明答案对应的资料编号。 资料{context}问题{question}response(client.chat.completions.create(modelLLM_MODEL,messages[{role:user,content:prompt}],temperature0,max_tokens512))answer(response.choices[0].message.content)return(answer,results)if__name____main__:print(*50)print(RAG 本地文件问答系统)print(输入 exit 退出)print(*50)whileTrue:questioninput(\n请输入问题).strip()ifquestion.lower()in[exit,quit]:print(程序退出)breakanswer,results(answer_question(question))print(\n答案)print(answer)print(\n检索结果)fori,iteminenumerate(results):print(f\nTop{i1})print(fChunk ID: f{item[chunk_id]})print(fSimilarity: f{item[score]:.4f})print(item[text][:300])
返回列表