rerank技术

101 阅读3分钟

Sentence Transformers

Sentence Transformers开源项目:github.com/UKPLab/sent… Sentence Transformers文档:www.sbert.net/

论文:arxiv.org/pdf/1908.10…

例子

安装

rerank模型原理

ColBERT论文:arxiv.org/pdf/2004.12…

ColBERT v2论文:arxiv.org/pdf/2112.01…

安装

cross-encoder例子

bi-encorder例子

llamaindex使用rerank模型

准备环境

使用网易embedding和reranker模型

使用网易有道的embedding模型bce-embedding-base_v1:huggingface.co/maidalun102… e-embedding-base_v1

使用网易有道的 rerank模型 bce-reranker-base_v1:huggingface.co/maidalun102… nker-base_v1/tree/main

使用 SentenceTransformerRerank来加载rerank模型

完整代码

def prepare_data(): url="baike.baidu.com/item/AIGC?f…" docs = TrafilaturaWebReader().load_data([url])

return docs

#embed保存知识到向量数据库

def embedding_data(docs): #向量数据库客户端

chroma_client = chromadb.EphemeralClient()

chroma_collection = chroma_client.create_collection("quickstart")

#向量数据库,指定了存储位置 vector_store =

ChromaVectorStore(chroma_collection=chroma_collection,persist_dir="./chroma_langc hain_db")

storage_context = StorageContext.from_defaults(vector_store=vector_store)

#创建文档切割器

node_parser = SimpleNodeParser.from_defaults(chunk_size=500,chunk_overlap=50)

#创建BAAI的embedding

embed_model = HuggingFaceEmbedding(model_name="maidalun1020/bce-embedding- base_v1")

#rerank模型

rerank = SentenceTransformerRerank( model="maidalun1020/bce-reranker- base_v1", top_n=3)

#创建index

base_index = VectorStoreIndex.from_documents(documents=docs,transformations= [node_parser],storage_context=storage_context, embed_model=embed_model)

return base_index,embed_model,rerank

def get_llm():

#创建OpenAI的llm

#llm = OpenAI(model="gpt-3.5-turbo")

#通义千问 '''

from llama_index.llms.dashscope import DashScope, DashScopeGenerationModels llm = DashScope(model_name=DashScopeGenerationModels.QWEN_MAX)

'''

#ollama本地模型

llm = Ollama(model="qwen2:7b-instruct-q4_0", request_timeout=120.0)

#创建谷歌gemini的llm

llm = Gemini()

return llm

def retrieve_data(question): #创建检索器

base_retriever = base_index.as_retriever(similarity_top_k=2)

#检索相关文档

retrievals = base_retriever.retrieve( question

)

#print(retrievals)

#docs.llamaindex.ai/en/stable/e…

from llama_index.core.response.notebook_utils import display_source_node

for n in retrievals:

display_source_node(n, source_length=1500)

return retrievals

def generate_answer(question):

query_engine = base_index.as_query_engine(similarity_top_k=5, node_postprocessors=[rerank] )

#大语言模型的回答

response = query_engine.query( question

)

print(str(response))

question="艾伦•图灵的论文叫什么" docs=prepare_data() llm=get_llm()

base_index,embed_model,rerank=embedding_data(docs)

#通过设置来配置 llm,embedding等等 Settings.llm = llm

Settings.embed_model = embed_model

#Settings.node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=20) Settings.num_output = 512

Settings.context_window = 3000

retrieve_data(question) generate_answer(question)

#龙 哥抖音号:龙 哥紫 貂智能

llamaindex使用rerank例子2

使用postprocessor的rerank

使用postprocessor来单独处理rerank流程

使用LLM作为ranker

论文:arxiv.org/abs/2308.07…

论文 Is ChatGPT Good at Search? Investigating Large Language Models as Re-Ranking Agents:http s://arxiv.org/pdf/2304.09542

列表方法详解

参考文档:docs.llamaindex.ai/en/stable/e…

RankGPT例子代码

rerank模型微调

环境准备

环境我们使用和embedding微调一个环境,我们再来一遍

llamaindex微调文档:docs.llamaindex.ai/en/stable/e… etuning/cross_encoder_finetuning/

数据格式

参考:huggingface.co/datasets/se… SentenceTransformer微调的triplet数据集格式,为jsonl文件

如果是4个负样本

上面是为了格式好看,真实的jsonl是一行一个json对象

模型微调

sbert.net/examples/tr…

模型微调脚本也比较简单,Python代码如下:

logger logging.basicConfig(

format="%(asctime)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S",

level=logging.INFO, handlers=[LoggingHandler()]

)

#底模路径

model_path = "F:/sotaAI/huggingface/models--BAAI--bge-small-en" train_batch_size = 8

num_epochs = 5

model_save_path = "ft_" + os.path.basename(model_path)

#设置num_labels=1,预测0到1之间的连续分数

model = CrossEncoder(model_path, num_labels=1, max_length=512)

train_samples = [] dev_samples = []

#读取训练数据和评估数据

train_df = pd.read_json(DATA_DIR+"/rerank_train.jsonl",lines=True) val_df = pd.read_json(DATA_DIR+"/rerank_val.jsonl",lines=True)

for i, row in train_df.iterrows(): train_samples.append(InputExample(texts=[row["query"],

row["positive"],row["negative"]]))

for i, row in val_df.iterrows(): dev_samples.append(InputExample(texts=[row["query"],

row["positive"],row["negative"]]))

#构建训练的dataloader

train_dataloader = DataLoader(train_samples, shuffle=True, batch_size=train_batch_size)

#评估器

#evaluator = CERerankingEvaluator(dev_samples, name="train-eval")

warmup_steps = 100

logging.info("Warmup-steps: {}".format(warmup_steps))

#训练模型 model.fit(

train_dataloader=train_dataloader, #evaluator=evaluator, epochs=num_epochs, evaluation_steps=100, optimizer_params={'lr': 1e-5},

FlagEmbedding微调rerank

文档:github.com/FlagOpen/Fl…

安装

数据格式

为jsonl文件

微调

模型合并

文档:github.com/FlagOpen/Fl…

利用autotrain来微调rerank模型

autotrain项目是 huggingface开源的 模型训练框架工具

项目地址:github.com/huggingface… autotrain文档地址:huggingface.co/docs/autotr…

可以用下面的命令启动autorain webui界面

也可以用下面的命令来使用autotrain

和embedding模型中使用的基本一样,有一下几个区别:一是底模选rerank底模,二是任务要是triplet任务

rerank模型评估

mteb评估

任务列表:github.com/embeddings-…

指定任务种类

c-mteb评估

c-mteb是基于mteb的

文档:github.com/FlagOpen/Fl…安装

指定c-mteb自定义的任务