무제

[Langchain] LLM 모델로 LLM 평가하기 본문

Project/LLM

[Langchain] LLM 모델로 LLM 평가하기

mugan1 2024. 11. 29. 16:59

Allganize에서 제공한 자동화 코드를 사용했고, 3가지의 평가 모델을 사용하여 내가 만든 모델이 GT와 일치성이 높으면 "O", 그렇지 않으면 "X"를 출력하도록 설계 되어있다.

 

모델은 ChatOpenAI의 효율성 좋은 GPT4-mini를 사용하였고, vector DB는 qdrant를 썼다

# model
llm = ChatOpenAI(
    temperature=0.1,
    model = "gpt-4o-mini"
)

cache_dir = LocalFileStore("./.cache/")

splitter = CharacterTextSplitter.from_tiktoken_encoder(
    separator="\n",
    chunk_size=600,
    chunk_overlap=100,
)
embeddings = OpenAIEmbeddings()
cached_embeddings = CacheBackedEmbeddings.from_bytes_store(embeddings, cache_dir)
client = QdrantClient("http://localhost:6333")
client.recreate_collection(
     collection_name="law",
     vectors_config=VectorParams(size=1536, distance=Distance.COSINE),
)
vectorstore = QdrantVectorStore(
    client=client,
    collection_name="law",
    embedding=cached_embeddings,
)

pdf_files = glob(r"C:\Users\user\Desktop\LHS\Project\Evaluate\*.pdf")
index_counter = {"current_index": 0}
async def process_pdf(file):
    print(file)
    loader = UnstructuredFileLoader(file)
    docs = loader.load_and_split(text_splitter=splitter)
    ids = []
    for _ in range(len(docs)):
        ids.append(index_counter["current_index"])
        index_counter["current_index"] += 1
    vectorstore.add_documents(documents=docs, ids=ids)

await asyncio.gather(*(process_pdf(file) for file in pdf_files))

retriever = vectorstore.as_retriever()

 

답변이 너무 길면, 생성과 평가가 너무 오래걸리는 것 같아, 비교적 축약한 답변을 내보내주는 map reduce 방식으로 텍스트를 요약했다

map_doc_prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            """
            Use the following portion of a long document to see if any of the text is relevant to answer the question. Return any relevant text verbatim. If there is no relevant text, return : ''
            -------
            {context}
            """,
        ),
        ("human", "{question}"),
    ]
)

map_doc_chain = map_doc_prompt | llm

def map_docs(inputs):
    documents = inputs["documents"]
    question = inputs["question"]
    return "\n\n".join(
        map_doc_chain.invoke(
            {"context": doc.page_content, "question": question}
        ).content
        for doc in documents
    )
    # for doc in documents:
    #     result = map_doc_chain.invoke({"context": doc.page_content, "question": question}).content
    #     print(result)
    # return 

map_chain = {
    "documents": retriever,
    "question": RunnablePassthrough(),
} | RunnableLambda(map_docs)

final_prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            """
            You are a competent lawyer. Answer questions in Korean using only the following context.
            Given the following extracted parts of a long document and a question, create a final answer. 
            If you don't know the answer, just say that you don't know. Don't try to make up an answer.
            ------
            {context}
            """,
        ),
        ("human", "{question}"),
    ]
)

chain = {"context": map_chain, "question": RunnablePassthrough()} | final_prompt | llm

 

Hugging face에서 데이터셋을 받아 pandas로 정제

import pandas as pd

from datasets import load_dataset
dataset = load_dataset("allganize/RAG-Evaluation-Dataset-KO")
df = pd.DataFrame(dataset['test'])

law_df = df[df['domain'] == 'law']
responses = []

for question in law_df["question"]:
    responses.append(chain.invoke(question).content)

law_df["map_reduce_answer"] = responses

 

Allganize에서 제공한 colab 자동화 코드를 사용하여 평가한 결과는...?

 

['X', 'X', 'X', 'O', 'X', 'O', 'O', 'O', 'X', 'X', 'O', 'O', 'O', 'O', 'O', 'X', 'O', 'X', 'O', 'O', 'O', 'O', 'X', 'X', 'O', 'O', 'X', 'X', 'O', 'O', 'X', 'X', 'O', 'O', 'O', 'O', 'O', 'X', 'O', 'O', 'O', 'O', 'O', 'O', 'X', 'O', 'O', 'O', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'O', 'X', 'O', 'O', 'X']

 

60개 중에서 35개를 맞췄다! 

 

Leaderboard로 비교하면 upstage의 gpt4 모델 정도의 성능이다 

 

다음에는 판례 및 법률 QA 데이터셋을 대용량으로 처리하는 법을 공부해볼 것이다. 

'Project > LLM' 카테고리의 다른 글

[Langchain] Dask로 대용량 판례 데이터 처리하기  (0) 2024.12.09
LLM 관련 자료 모음  (0) 2024.11.30
[Langchain] Model Evaluation - 1  (0) 2024.11.24
[Langchain] Map Re-rank  (1) 2024.11.22
[Langhchain] Refine  (0) 2024.11.21
Comments