news 2026/6/22 13:47:28

RAG入门

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RAG入门

对提取的文本进行分块

def chunk_text(text, n, overlap): """ Chunks the given text into segments of n characters with overlap. Args: text (str): 文本 n (int): 块长度 overlap (int): 重叠度 Returns: List[str]: A list of text chunks. """ chunks = [] # Initialize an empty list to store the chunks # Loop through the text with a step size of (n - overlap) for i in range(0, len(text), n - overlap): # Append a chunk of text from index i to i + n to the chunks list chunks.append(text[i:i + n]) return chunks

块长度和重叠度会影响semantic search的质量

文本块创建嵌入

embedding将文本转换为数值向量,这允许进行高效的相似性搜索

def create_embeddings(text): # Create embeddings for the input text using the specified model response = client.embeddings.create( model="nomic-embed-text", input=text ) return response # Return the response containing the embeddings # 文本块的嵌入向量 response = create_embeddings(text_chunks)

语义搜索

实现余弦相似度来找到与用户查询最相关的文本片段

def cosine_similarity(vec1, vec2): """ Calculates the cosine similarity between two vectors. Args: vec1 (np.ndarray): The first vector. vec2 (np.ndarray): The second vector. Returns: float: The cosine similarity between the two vectors. """ # Compute the dot product of the two vectors and divide by the product of their norms return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))
def semantic_search(query, text_chunks, embeddings, k=5): """ Performs semantic search on the text chunks using the given query and embeddings. Args: query (str): The query for the semantic search. text_chunks (List[str]): A list of text chunks to search through. embeddings (List[dict]): A list of embeddings for the text chunks. k (int): The number of top relevant text chunks to return. Default is 5. Returns: List[str]: A list of the top k most relevant text chunks based on the query. """ # Create an embedding for the query query_embedding = create_embeddings(query).data[0].embedding similarity_scores = [] # Initialize a list to store similarity scores # Calculate similarity scores between the query embedding and each text chunk embedding for i, chunk_embedding in enumerate(embeddings): similarity_score = cosine_similarity(np.array(query_embedding), np.array(chunk_embedding.embedding)) similarity_scores.append((i, similarity_score)) # Append the index and similarity score # Sort the similarity scores in descending order similarity_scores.sort(key=lambda x: x[1], reverse=True) # Get the indices of the top k most similar text chunks top_indices = [index for index, _ in similarity_scores[:k]] # Return the top k most relevant text chunks return [text_chunks[index] for index in top_indices]

在提取的文本块上进行语义搜索

# Load the validation data from a JSON file with open('../../data/val.json', encoding="utf-8") as f: data = json.load(f) # Extract the first query from the validation data query = data[0]['question'] # Perform semantic search to find the top 2 most relevant text chunks for the query top_chunks = semantic_search(query, text_chunks, response.data, k=2) # Print the query print("Query:", query) # Print the top 2 most relevant text chunks for i, chunk in enumerate(top_chunks): print(f"Context {i + 1}:\n{chunk}\n=====================================")

基于检索到的片段生成响应

# Define the system prompt for the AI assistant system_prompt = "你是一个AI助手,严格根据给定的上下文进行回答。如果无法直接从提供的上下文中得出答案,请回复:'我没有足够的信息来回答这个问题。'" def generate_response(system_prompt, user_message): """ Generates a response from the AI model based on the system prompt and user message. Args: system_prompt (str): The system prompt to guide the AI's behavior. user_message (str): The user's message or query. Returns: dict: The response from the AI model. """ response = client.chat.completions.create( model=os.getenv("LLM_MODEL_ID"), messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_message} ], temperature=0.1, top_p=0.8, presence_penalty=1.05, max_tokens=4096, ) return response.choices[0].message.content # Create the user prompt based on the top chunks user_prompt = "\n".join([f"上下文内容 {i + 1}:\n{chunk}\n=====================================\n" for i, chunk in enumerate(top_chunks)]) user_prompt = f"{user_prompt}\n问题: {query}" # Generate AI response ai_response = generate_response(system_prompt, user_prompt) print(ai_response)

一开始我的text_chunks,块长度为500,重叠度100,结果

后面调整重叠度到150

可见重叠度的选择会对semantic search的质量产生影响

评估响应质量

# Define the system prompt for the evaluation system evaluate_system_prompt = "你是一个智能评估系统,负责评估AI助手的回答。如果AI助手的回答与真实答案非常接近,则评分为1。如果回答错误或与真实答案不符,则评分为0。如果回答部分符合真实答案,则评分为0.5。" # Create the evaluation prompt by combining the user query, AI response, true response, and evaluation system prompt evaluation_prompt = f"用户问题: {query}\nAI回答:\n{ai_response}\nTrue Response: {data[0]['ideal_answer']}\n{evaluate_system_prompt}" # Generate the evaluation response using the evaluation system prompt and evaluation prompt evaluation_response = generate_response(evaluate_system_prompt, evaluation_prompt) print(evaluation_response)

1.0

AI助手的回答与真实答案在核心定义和重要性方面高度一致。真实答案强调XAI的目标是提高透明度和可理解性,并指出其重要性在于建立信任、问责和公平性。AI回答详细阐述了这些要点,并补充了"安全性"作为重要性的一部分(虽然真实答案未明确提及),但整体内容准确且未偏离主题。因此,回答与真实答案非常接近,评分为1.0。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/19 3:28:59

Python如何识别周围WiFi:跨平台实现与进阶技巧

在物联网设备管理、网络安全审计或智能家居场景中,识别周围WiFi网络是基础需求。Python凭借其丰富的生态库,能够跨平台实现WiFi扫描、信号强度检测及网络分析。本文将系统梳理主流方法,结合代码示例与性能对比,帮助开发者快速构建…

作者头像 李华
网站建设 2026/6/13 21:22:37

基于spring mvc和mybatis的网上食品零食商城系统视频vue3

目录 系统架构与技术栈核心功能模块技术实现要点数据库设计示例部署与扩展建议 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 系统架构与技术栈 Spring MVC MyBatis 作为后端框架,Vue3 作为…

作者头像 李华
网站建设 2026/6/15 18:48:26

常用的css

js控制样式&#xff1a; //html中&#xff1a;<text class"test_text" :style"{--base_color:currentColor}">测试</text>//data中:currentColor:pink //methods中&#xff1a;this.currentColorred//style中&#xff1a;使用变量取值.test_t…

作者头像 李华
网站建设 2026/6/22 11:45:30

枚举中间

lc lc2964 枚举中间hash class Solution { public: int divisibleTripletCount(vector<int>& nums, int d) { int n nums.size(); if (n < 3) return 0; int ret 0; unordered_map<int, int> hash; hash[nums[0] % d]; // 枚举中间 for (int i 1; i &l…

作者头像 李华
网站建设 2026/6/13 21:48:09

三菱PLC六层电梯控制系统设计含报告程序【程序与文档】(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

三菱PLC六层电梯控制系统设计含报告程序【程序与文档】(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码组态川基于三菱PLC的六层电梯控制系统设计[配套设计报告&#xff0c;程序&#xff0c;组态) 含基于三菱PLC的六层电梯控制…

作者头像 李华