무제
[Langchain] LLM 모델로 LLM 평가하기 본문
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