week10

目标

基于手头文件写了一个问答系统,不需要网页,能用代码做出回答就行,方法任选即可

解读

读取本地文件 → 文本切分 → 向量化 → 检索相关内容 → 调用大模型生成答案。使用RAG方法。

流程:

python 复制代码
本地文件
   ↓
Document Parsing
   ↓
文本切分 Chunk
   ↓
Embedding
   ↓
向量数据库 / FAISS
   ↓
用户问题
   ↓
Query Embedding
   ↓
Top-K Retrieval
   ↓
相关上下文
   ↓
LLM
   ↓
最终答案

方案

python 复制代码
Python
+
Sentence Transformers
+
FAISS
+
vLLM

内容

python 复制代码
pip install sentence-transformers faiss-cpu openai pypdf

import pickle

import faiss
import numpy as np

from openai import OpenAI

from sentence_transformers import (
    SentenceTransformer
)


EMBEDDING_MODEL = (
    "BAAI/bge-small-zh-v1.5"
)


LLM_MODEL = (
    "Qwen/Qwen2.5-1.5B-Instruct"
)


TOP_K = 3


embedding_model = (
    SentenceTransformer(
        EMBEDDING_MODEL
    )
)


index = faiss.read_index(
    "index/faiss.index"
)


with open(
    "index/chunks.pkl",
    "rb"
) as f:

    chunks = pickle.load(
        f
    )


client = OpenAI(
    base_url=(
        "http://localhost:8000/v1"
    ),
    api_key="EMPTY"
)


def retrieve(
    question,
    top_k=3
):

    query_embedding = (
        embedding_model.encode(
            [question],
            normalize_embeddings=True
        )
    )


    query_embedding = np.asarray(
        query_embedding,
        dtype="float32"
    )


    scores, indices = (
        index.search(
            query_embedding,
            top_k
        )
    )


    results = []


    for score, idx in zip(
        scores[0],
        indices[0]
    ):

        results.append({
            "score": float(score),
            "chunk_id": int(idx),
            "text": chunks[idx]
        })


    return results


def answer_question(
    question
):

    results = retrieve(
        question,
        TOP_K
    )


    context = "\n\n".join(
        [
            (
                f"[资料 {i + 1}] "
                f"Chunk {item['chunk_id']}\n"
                f"{item['text']}"
            )

            for i, item
            in enumerate(results)
        ]
    )


    prompt = f"""
你是一个本地文件问答助手。

请严格根据下面提供的资料回答问题。

要求:

1. 只能依据提供的资料回答。
2. 不要编造资料中不存在的信息。
3. 如果资料中无法找到答案,请回答:
   根据当前文件内容无法确定。
4. 回答尽量简洁、清晰。
5. 如果可以,请说明答案对应的资料编号。

资料:

{context}

问题:

{question}
"""


    response = (
        client.chat.completions.create(
            model=LLM_MODEL,
            messages=[
                {
                    "role": "user",
                    "content": prompt
                }
            ],
            temperature=0,
            max_tokens=512
        )
    )


    answer = (
        response
        .choices[0]
        .message
        .content
    )


    return (
        answer,
        results
    )


if __name__ == "__main__":

    print(
        "=" * 50
    )

    print(
        "RAG 本地文件问答系统"
    )

    print(
        "输入 exit 退出"
    )

    print(
        "=" * 50
    )


    while True:

        question = input(
            "\n请输入问题:"
        ).strip()


        if question.lower() in [
            "exit",
            "quit"
        ]:

            print(
                "程序退出"
            )

            break


        answer, results = (
            answer_question(
                question
            )
        )


        print(
            "\n答案:"
        )

        print(
            answer
        )


        print(
            "\n检索结果:"
        )


        for i, item in enumerate(
            results
        ):

            print(
                f"\nTop {i + 1}"
            )


            print(
                f"Chunk ID: "
                f"{item['chunk_id']}"
            )


            print(
                f"Similarity: "
                f"{item['score']:.4f}"
            )


            print(
                item["text"][:300]
            )
相关推荐
JackSparrow4142 小时前
和AI一起将全部CSDN博文迁移到个人博客站
人工智能·程序人生·ai·github·cloudflare·astro·静态博客
搬砖的小码农_Sky2 小时前
AI Agent:如何处理Claude Code 最近版本(2026年更新)引入的模型上下文限制
人工智能·windows·ai·ai编程
kaixin_啊啊3 小时前
【零基础学AI】第 1 章课后练习与答案
人工智能·ai
李航19835 小时前
AI定制柜建模,需要详细的建模规范和标准流程
人工智能·python·计算机视觉·ai·ai编程
kaixin_啊啊8 小时前
【零基础学AI】第 1 章——AI 究竟包含哪些技术?
人工智能·ai
VIP_CQCRE8 小时前
Coze 接入大模型太麻烦?用 Ace Data Cloud 统一 OpenAI Responses API
ai·大模型·agent·coze·acedatacloud
CoderJia程序员甲10 小时前
GitHub 热榜项目 - 周榜(2026-10-03)
ai·大模型·llm·github·ai教程
IvorySQL10 小时前
PostgreSQL 日报| relchecks 溢出导致表无法删除(9 月 28 日)
数据库·人工智能·ai·postgresql·区块链