# spark_demo **Repository Path**: cyberxie/spark_demo ## Basic Information - **Project Name**: spark_demo - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-07-29 - **Last Updated**: 2024-08-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 概述 该项目实现了一个基于讯飞平台的RAG问答系统。系统从 JSONL 文件中读取问题和候选答案的数据,使用嵌入 API 为问题生成嵌入向量,然后将这些嵌入向量存储在 FAISS 向量数据库中以便高效的相似性搜索。给定一个新的查询问题,系统从数据库中检索最相似的问题,并构建一个提示词来生成适当的答案。 ## 前提条件 在运行项目之前,请确保已安装以下内容: - Python 3.9 或更高版本 - `numpy` - `faiss` - `spark_ai_python` ## 设置 1. **克隆仓库:** ```bash git clone https://gitee.com/cyberxie/spark_demo.git cd spark_demo ``` 或者直接下载zip文件 https://gitee.com/cyberxie/spark_demo 2. **安装所需的包:** ```bash pip install numpy faiss pip install --upgrade spark_ai_python ``` 3. **放置输入 JSONL 文件:** 源数据格式: ```bash {"answer": "你好,农村本集体经济组织成员之间的农村房屋买卖合同,应认定有效。集体经济组织成员与外集体经济组织成员之间的房屋买卖合同,效力认定应慎重对待。", "candidate_answer": "问题的关键在于,买卖双方是否同一个集体经济组织成员?如果不是的话,依照现行法律,如果买卖行为发生在XXXX年,不能过户,", "cause": "房产纠纷", "question": "平房,房本是集体土地使用证,过户困难,可以打合同协议过户吗,因为必须要求本庄名下没有房产的才能过户,想问协议卖房可以吗,合同生效吗"} {"answer": "你好,你可以与你老婆先协议离婚,协议不成可以到法院去起诉离婚。", "candidate_answer": "你可以与你老婆先协议离婚,协议不成可以到法院去起诉离婚", "cause": "婚姻家庭", "question": "我想离婚了,我老婆不愿意生孩子我觉得没意思"} ``` 数据集在文件夹根目录,可自行决定位置,确保您的输入 input_file 路径和源文件地址对应, 应修改:input_file = r'train30.jsonl' ## 配置 确保在脚本中设置以下凭据: - `APPID` - `APISecret` - `APIKEY` - `input_file` 将脚本中的占位符替换为您的实际凭据。 ## 运行脚本 使用以下命令运行脚本: ``` python main.py ``` 脚本执行以下步骤: 1. **读取输入数据:** 从 JSONL 文件中读取问题和候选答案。 2. **生成嵌入向量:** 使用提供的 `Embedding` API 为每个问题生成嵌入向量。 3. **创建 FAISS 索引:** 创建一个 FAISS 索引并将生成的嵌入向量添加到其中。 4. **查询处理:** 接收查询问题,生成其嵌入向量,并在 FAISS 索引中搜索相似问题。 5. **提示词生成:** 使用最相似的问题和候选答案构建提示词,并使用 `generate` 函数生成回答。 ## 代码详解 ### 导入所需库 ```python import json import Embedding import numpy as np import time import utils import faiss from demo import generate ``` ### 初始化变量 设置必要的 API 凭据和输入文件路径。 ```python APPID = '' APISecret = '' APIKEY = '' input_file = r'' ``` ### 读取输入数据 从 JSONL 文件中读取问题和候选答案。 ```python questions_answers = [] with open(input_file, 'r', encoding='utf-8') as infile: for line in infile: data = json.loads(line) if "question" in data and "candidate_answer" in data: questions_answers.append((data["question"], data["candidate_answer"])) ``` ### 生成嵌入向量 使用 `Embedding` API 为每个问题生成嵌入向量。 ```python questions = [qa[0] for qa in questions_answers] json_list = utils.create_json_objects(questions) vectors = [] for item in json_list: try: res = Embedding.get_embp_embedding(item, appid=APPID, apikey=APIKEY, apisecret=APISecret) vector = Embedding.parser_Message(res) vectors.append(vector) except Exception as e: print(f"Error initializing this embedding question: {e}") ``` ### 创建 FAISS 索引 创建一个 FAISS 索引并将嵌入向量添加到其中。 ```python index = utils.create_db(len(vectors[0])) vectors = np.array(vectors) index = utils.add_vector(index, vectors) ``` ### 查询处理 为查询问题生成嵌入向量,并在 FAISS 索引中搜索相似问题。 ```python query_question = "原房东不让转租,二手房东出租给我,我可以退房租吗" query_questioned = utils.create_json_object(query_question) res1 = Embedding.get_embp_embedding(query_questioned, appid=APPID, apikey=APIKEY, apisecret=APISecret) test_vector = Embedding.parser_Message(res1) if len(test_vector.shape) == 1: test_vector = test_vector.reshape(1, -1) distances, indices = utils.search_vector(index, test_vector) top_k_answers = [qa_map[idx] for idx in indices[0]] ``` ### 提示词生成和回答 使用最相似的问题和候选答案构建提示词,并生成回答。 ```python prompt = utils.build_prompt(query_question, top_k_answers) generate(prompt) ``` ## 结论 该说明文档提供了基于嵌入向量的问答系统的概述和详细步骤。请确保在运行脚本之前安装所有依赖项并正确放置输入文件。