♥复试第十五天
项目RAG一种将信息检索系统与大语言模型的生成能力相结合的技术框架。基础流程索引、检索和生成。索引目的是把杂乱的非结构化文档处理成计算机便于快速查找的格式。有基于关键词的索引和基于语义的索引。检索不同的索引结构对应不同的检索方式》《mmmmmmmmmmm可以根据关键词和根据语义进行检索。2. 两种索引和检索的方式基于关键词匹配无法理解语义和基于语义向量化可以理解语义文本预加载-文本分割固定长度分割引入一定的重叠区域#建立document对象 for response_ref in response_refs: if len(response_ref) 0: documents.append(Document(textresponse_ref)) #文本分割 node_parser SentenceSplitter(chunk_sizeself.chunk_size, chunk_overlapself.chunk_overlap) #SentenceSplitter 的作用是一个文本分割器负责把长文本切成适合检索的小块。 nodes node_parser.get_nodes_from_documents(documents)2.1基于关键词最常用的算法BM25求每一个文件D和关键词Q之间的相关性。利用技术倒排索引记录每个词出现在每个文档里的频率词频饱和机制防止无意义的词重复导致文件得分高长度归一化机制避免文章长度太长导致的得分高bm25_retriever BM25Retriever.from_defaults( nodesnodes, similarity_top_ksimilarity_top_k )2.2基于词块向量的索引和检索将文本转换成高维向量语义相近的向量在向量空间里距离较近可以找到意思最相关的文本步骤nodes-embedding(存储在字典里根据HNSW 构建索引结构-retrieve(利用余弦相似度找到最相近的向量-选择top-k输出embedding模型的训练1.预训练 2. 模型微调模型微调指句子提取向量进行对比学习训练目的是让语义相近的向量挨的更近。微调的方法将句子映射到向量计算不同向量间相似度用softmax转变成概率分布,构建Infonce损失函数行损失和列损失最终损失是两者的平均值。# 相似度矩阵 S (3x3) h1 h2 h3 h1 [ sim11 sim12 sim13 ] h2 [ sim21 sim22 sim23 ] h3 [ sim31 sim32 sim33 ] # 行方向对每行做 softmax 行1: softmax([sim11, sim12, sim13]) → 希望 sim11 最大 行2: softmax([sim21, sim22, sim23]) → 希望 sim22 最大 行3: softmax([sim31, sim32, sim33]) → 希望 sim33 最大 # 列方向对每列做 softmax 列1: softmax([sim11, sim21, sim31]) → 希望 sim11 最大 列2: softmax([sim12, sim22, sim32]) → 希望 sim22 最大 列3: softmax([sim13, sim23, sim33]) → 希望 sim33 最大检索过程#构建embedding模型 embedding_model HuggingFaceEmbedding( model_nameembedding_model_path, devicedevice ) #构建向量索引 index VectorStoreIndex(nodes, embed_modelself.embedding_model) #构建索引器 vector_retriever index.as_retriever(similarity_top_kself.top_k) #执行索引 vector_results vector_retriever.retrieve(query)2.3.去重合并将bm25生成的vector生成的结果进行合并和去重。3.生成检索阶段完成已经得到query相关的参考文献进入生成阶段即利用大语言模型LLM结合参考文献生成最终答案。包含两个重要部分prompt和LLM推理C笔试2024年真题二编程题1.编写程序输入一个数字n(n10000000)将其中各个位的奇数提取出来逆序组成一个新的数字输出。比如输入n为1769243输出为3971。#include stdio.h #include math.h int main() { int num[8] { 0 }; int n, count 0; scanf(%d, n); int i 0; int data 0; while ((n /10) ! 0) { num[i] n%10; n n / 10; i; count; } num[i] n; count; for (int m 0; m count; m) { if (num[m] % 2 ! 0) { printf(%d, num[m]); } } return 0; }2.编写程序输入的字符串中只包含字母和*将字符串中除了首位部分的*号去掉。例如输入字符串为****AB*C*DE**F***输出的字符串应为****ABCDEF***。int earase_L(char str[]) { int left 0; int i 0; while (str[i] ! \0) { if (str[i] Z str[i]A) left; else { if (left 0) { str[i] 0; } } i; } return 0; } int earase_R(char str[]) { int right 0; int i strlen(str); for(i;i0;i--){ if (str[i] Z str[i]A) right; else { if (right 0) { str[i] 0; } } } return 0; } int main() { char str[20]; char strl[20]; char strr[20]; gets(str); int len strlen(str); strcpy(strl, str); strcpy(strr, str); earase_L(strl); earase_R(strr); int i; for ( i 0; i len; i) { if (strl[i] ! 0) printf(%c,strl[i]); } int j len-1; while (strr[j] *) { printf(%c,strr[j]); j--; } return 0; }3.编写程序将一个单链表不带头结点进行冒泡排序typedef struct node { int data; struct node* next; }Linklist; int Len(Linklist *list) { Linklist* plist; int count 0; while (p ! NULL) { p p-next; count; } return count; } int Swap(Linklist* p, Linklist* q) { int tempt 0; tempt p-data; p-data q-data; q-data tempt; return 0; } void Sort(Linklist* list) { Linklist* plist; Linklist* q p-next; int len Len(list); for (int i 0; i len-1; i) { for (int j 0; j len - i - 1; j) { if ((p-data) (q-data)) { Swap(p, q); } p p-next; q q-next; } p list; q p-next; } }一简答题1. 请简述数组和结构体的区别及联系联系两者都可以用来存储信息结构体内元素可以包含数组数组内也可以是结构体区别一个结构体可以有不同类型的数据而数组所有数据类型必须相同结构体可以用结构体名.取结构体内元素数组可以用[ ]索引的方式查找内部元素如果用指针构建结构体指针通常指向结构体内第一个元素位置而用指针构建数组指针指向数组首地址2.解释下面四条语句考察运算符优先级【】. - 后置后置--优先级最高从内到外从右到左优先级高的先运算。int *p[4]; #大小为4的指针型数组指针指向int型元素 int (*p)[4]; #一个指针指向大小为4的Int型数组 int *p(); #函数返回类型是Int型指针可以是一个数组或者一个链表 int (*p)(); #p是一个指针指向返回值是Int型的函数即函数指针3.static作用全局变量和普通的全局变量有什么区别static 局部变量和普通的局部变量有什么区别4.下面程序的功能是将字符串src逆序输出请找出下面的错误。#includestring.h #缺少includestdlib.h void main(){ char *src hello,world; char *dest, *d, *s; int len,i; len strlen(src); dest (char *)malloc(len); #改dest(char*)malloc((len1)*sizeof(char)); ssrc[len]; #改ssrc[len-1] ddest; while(len--!0) { ds--; #改*d*s-- } printf(%s,dest); }各种头文件的作用stdio.h string.h math.h stdlib.h.