File size: 1,931 Bytes
2a51e7d
26de2cd
2a51e7d
 
 
26de2cd
2a51e7d
26de2cd
2a51e7d
26de2cd
 
 
 
 
 
 
2a51e7d
0a8b0d4
 
2a51e7d
26de2cd
 
2a51e7d
 
26de2cd
 
 
 
 
 
84c30b3
26de2cd
84c30b3
26de2cd
0a8b0d4
84c30b3
2a51e7d
26de2cd
 
 
 
 
 
 
2a51e7d
 
 
 
 
 
26de2cd
0a8b0d4
2a51e7d
 
 
 
 
 
26de2cd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import os
from langchain_community.vectorstores import Pinecone
from langchain_community.embeddings.fastembed import FastEmbedEmbeddings
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import FlashrankRerank
from langchain.retrievers import EnsembleRetriever, BM25Retriever
from langchain_core.tools import tool
from typing import Any

from apps.agent.utils import load_and_split_docs
from apps.agent.constant import (
    INDEX_NAME_WEWEB, 
    INDEX_NAME_XANO,
    URLS_WEWEB,
    URLS_XANO,
)

embeddings = FastEmbedEmbeddings(model_name="jinaai/jina-embeddings-v2-small-en")
compressor = FlashrankRerank(model="ms-marco-MiniLM-L-12-v2")

def ensemble_retriever(index_name: str, docs: Any, embeddings, compressor):
    # retriever
    vectorstore = Pinecone.from_existing_index(embedding=embeddings, index_name=index_name)
    retriever = vectorstore.as_retriever()

    # bm25
    bm25 = BM25Retriever.from_documents(docs)
    bm25.k = 6
    ensemble_retriever = EnsembleRetriever(retrievers=[retriever, bm25],
                                       weights=[0.6, 0.4])
    
    # reranker
    reranker_retriever = ContextualCompressionRetriever(
        base_compressor=compressor, base_retriever=ensemble_retriever
    )
    return reranker_retriever

# load data
data_xano = load_and_split_docs(URLS_XANO)
data_weweb = load_and_split_docs(URLS_WEWEB)

# create retriever
retriever_xano = ensemble_retriever(INDEX_NAME_XANO, data_xano, embeddings, compressor)
retriever_weweb = ensemble_retriever(INDEX_NAME_WEWEB, data_weweb, embeddings, compressor)

@tool
def tool_xano(query: str):
    """
    Searches and returns excerpts from the Xano documentation
    """
    return retriever_xano.invoke(query)
    

@tool
def tool_weweb(query: str):
    """
    Searches and returns excerpts from the Weweb documentation
    """
    return retriever_weweb.invoke(query)