
--- README.md
+++ README.md
... | ... | @@ -1,27 +1,66 @@ |
1 | 1 |
# RAG-minimal-example |
2 |
+ |
|
2 | 3 |
모든것이 On-Premise에서 작동하는 Retrival Argmented Generation의 최소 예제입니다. |
3 | 4 |
회사내의 워크스테이션에서 작동하는 vLLM서버를 통하여 언어모델을 작동하고, 개인 컴퓨터에서 임베딩 모델이 작동됩니다. 따라서 서버가 닫혀있으면 작동하지 않습니다. |
4 |
- 이 경우 윤영준 주임에게 요구하여 서버를 다시 여는 방법 하나, 원한다면 코드를 조금만 수정하여 OpenAI 나 Claude등의 api를 사용하는 방법 둘, 심지어는 LlamaCPP를 통한 완전한 로컬 LLM 구동하는 방법 셋이 있습니다. 이러한 LLM 인터페이스를 위한 자세한 내용은 LLAMA INDEX 개발 문서를 참조해주세요. LlamaCPP는 직접 컴파일 해야 하며, 컴파일 방법은 LlamaCPP 깃허브 페이지 및 LlamaCPP-Python 바인딩 프로젝트 깃허브 페이지를 참고해주세요. vLLM을 별도로 구축하고자 할 때에는 리눅스 구동을 강력 권장합니다. 또한 모델 사이즈가 작지 않으므로 이미 작업된 양자화 모델 가중치를 찾아 구동하는것을 추천 드립니다. 현재 vLLM을 통하여 구동되는 Mixtral 모델 또한 4INT AWQ양자화가 되어 있습니다. |
|
5 | 5 |
|
6 |
-vector db 는 postgresql 의 extension인 pgvector를 사용하고 있으며 이에 대한 설치 방법은 해당 프로젝트 github 페이지를 참고하시길 부탁드립니다. https://github.com/pgvector/pgvector |
|
7 |
-데이터 베이스 설정은 db_config.json을 수정하여 진행합니다. |
|
8 |
-data 폴더에 넣고 싶은 파일(pdf, word, txt, .md)를 넣고 document_embedding.py를 실행하면 서버위에 data 폴더 안에 있는 파일의 텍스트를 모두 임베딩합니다. 이 리포에는 예제로 텍스트 파일이 들어가 있습니다. 실행시마다 설정된 table을 리셋하고 새로 임베딩을 빌드하는 방식이기 때문에 파일이 많으면 오래 걸릴 수 있습니다. vector db의 특성상 하나의 새로운 element를 삽입하면 search tree를 다시 지어야 하기 때문에 프로토타입단계에서는 이것으로 마무리하고, 차후 Cassnadra 5.X로 넘어가 고도화 할 계획입니다. (PG vector는 임베딩을 relational 처럼 다룰 수 있게 하지만, 이때문에 상당한 성능의 희생을 감수하였습니다.) |
|
9 |
-또한 document_load_embedding.py 는 새로 임베딩을 실행하지 않고 vector db에서 임베딩을 불러와 검색하는 방식입니다. |
|
6 |
+data 폴더에 넣고 싶은 파일(pdf, word, hwp, txt, .md)를 넣고 document_embedding.py를 실행하면 서버위에 data 폴더 안에 있는 파일의 텍스트를 모두 임베딩합니다. 이 리포에는 예제로 텍스트 파일이 들어가 있습니다. |
|
7 |
+ |
|
8 |
+맨 예제 코드 파일 맨 아랫줄에 |
|
9 |
+ |
|
10 |
+```python |
|
11 |
+response = query_engine.query("what did author do?") |
|
12 |
+print(response) |
|
13 |
+``` |
|
14 |
+ |
|
15 |
+이것만 수정하면 원하는 질의응답을 할 수 있습니다. |
|
16 |
+ |
|
17 |
+현재 작동중인 모델은 Mixtral 8x7B - instruct v0.1 이며 AWQ 4INT 양자화를 사용하였습니다. |
|
18 |
+ |
|
19 |
+document_load_embedding.py 는 새로 임베딩을 실행하지 않고 vector db에서 임베딩을 불러와 검색하는 방식입니다. |
|
20 |
+ |
|
21 |
+## 작동 구조 - LLM |
|
10 | 22 |
|
11 | 23 |
기본 설정된 embedding 파일은 한국어를 지원합니다. LLM(Mixtral)또한 한국어를 지원하지만 때때로 영어로 대답하는 문제가 있으며 이는 LLAMA INDEX상에서 기본적으로 하고 있는 프롬프트 엔지니어링이 모두 영어여서 그럴 수 있습니다. (이 문제는 gpt3.5-turbo도 가지고 있는 문제입니다) |
12 | 24 |
또한 Mixtral의 근본적인 한계로써, 영단어의 한국어 음차를 이상하게 읽는 문제가 있습니다. |
13 |
-현재 Llama Index의 가장 기본적인 프롬프트 엔지니어링을 사용하고 있습니다. 따라서 대답이 단답형이고 딱딱합니다. |
|
25 |
+현재 Llama Index의 가장 기본적인 프롬프트 엔지니어링을 사용하고 있습니다. 따라서 대답이 단답형이고 딱딱합니다. |
|
14 | 26 |
|
27 |
+## 작동 구조 - Vector DB 및 임베딩 |
|
15 | 28 |
|
29 |
+vector db 는 postgresql 의 extension인 pgvector를 사용하고 있으며 이에 대한 설치 방법은 해당 프로젝트 github 페이지를 참고하시길 부탁드립니다. [GitHub - pgvector/pgvector: Open-source vector similarity search for Postgres](https://github.com/pgvector/pgvector) |
|
30 |
+데이터 베이스 접속 설정은 db_config.json을 수정하여 진행합니다. |
|
16 | 31 |
|
32 |
+실행시마다 설정된 table을 리셋하고 새로 임베딩을 빌드하는 방식이기 때문에 파일이 많으면 오래 걸릴 수 있습니다. vector db의 특성상 하나의 새로운 element를 삽입하면 search tree를 다시 지어야 하기 때문에 프로토타입단계에서는 이것으로 마무리하고, 차후 Cassnadra 5.X로 넘어가 고도화 할 계획입니다. (PG vector는 임베딩을 relational 처럼 다룰 수 있게 하지만, 이때문에 상당한 성능의 희생을 감수하였습니다. 그래도 문서 몇천장정도는 이상이 없을것으로 보입니다.) |
|
33 |
+ |
|
34 |
+# 원하는 언어모델 실행 |
|
35 |
+ |
|
36 |
+만약 ChatGPT 등 api서비스를 통하여 강력한 언어모델의 사용을 원한다면 |
|
37 |
+ |
|
38 |
+1. 해당되는 서비스의 API키를 받아 |
|
39 |
+ |
|
40 |
+2. LLAMA INDEX 에서 제공하는 바인딩을 이용해 코드 수정 |
|
41 |
+ |
|
42 |
+ |
|
43 |
+만약 언어 모델을 직접 구동하고 싶다면 |
|
44 |
+ |
|
45 |
+1. 듀얼 부팅등을 통하여 Linux 시스템을 구축하거나 WSL(Windows Subsystem Linux)을 활용하여 최신 리눅스 환경을 구축하고 (원도우에서 돌리다가 안되는거 ) |
|
46 |
+ |
|
47 |
+2. LLAMA CPP를 컴파일하고 (다음의 프로젝트 참조) |
|
48 |
+ |
|
49 |
+ [GitHub - ggerganov/llama.cpp: Port of Facebook's LLaMA model in C/C++](https://github.com/ggerganov/llama.cpp) |
|
50 |
+ |
|
51 |
+ [GitHub - abetlen/llama-cpp-python: Python bindings for llama.cpp](https://github.com/abetlen/llama-cpp-python) |
|
52 |
+ |
|
53 |
+3. Hugging Face에서 호환되는 언어모델 가중치를 받아 LLAMA INDEX에서 제공하는 함수를 통해 코드 수정 |
|
54 |
+ |
|
17 | 55 |
|
18 | 56 |
# 실행 예시 답변 (프롬프트 전체 노출) |
19 |
-|형광밑줄 설명| |
|
20 |
-|------| |
|
21 |
-|<span style="background-color:#C0FFFF">파란색 : 프롬프트 엔지니어링</span>| |
|
22 |
-|<span style="background-color:#fff5b1">노란색 : 프롬프트에 삽입된 임베딩 검색 결과</span>| |
|
23 |
-|<span style="background-color:#FFE6E6">붉은색 : 유저 입력 </span>| |
|
24 |
-|<span style="background-color:#E6E6FA">보라색 : LLM 출력</span>| |
|
57 |
+ |
|
58 |
+| 형광밑줄 설명 | |
|
59 |
+| --- | |
|
60 |
+| <span style="background-color:#C0FFFF">파란색 : 프롬프트 엔지니어링</span> | |
|
61 |
+| <span style="background-color:#fff5b1">노란색 : 프롬프트에 삽입된 임베딩 검색 결과</span> | |
|
62 |
+| <span style="background-color:#FFE6E6">붉은색 : 유저 입력 </span> | |
|
63 |
+| <span style="background-color:#E6E6FA">보라색 : LLM 출력</span> | |
|
25 | 64 |
|
26 | 65 |
<span style="background-color:#C0FFFF">Context information is below.</span> |
27 | 66 |
<span style="background-color:#C0FFFF">---------------------</span> |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?