Spaces:
Sleeping
Sleeping
thanhtung09t2
commited on
Commit
•
0859f1c
1
Parent(s):
c54b114
Upload llms settings
Browse files- api/llms/base.py +13 -0
- api/llms/gpt4o_mini.py +81 -0
- api/llms/key_utils.py +20 -0
- api/llms/llm_config.py +20 -0
api/llms/base.py
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from api.llms.llm_config import LLMConfig
|
2 |
+
import api.llms.gpt4o_mini as gpt4o
|
3 |
+
|
4 |
+
def get_LLM(model_name) -> LLMConfig:
|
5 |
+
"""
|
6 |
+
Hàm điều hướng trung gian xử lý tác vụ tạo LLM, config và prompt template liên quan
|
7 |
+
"""
|
8 |
+
if model_name == "gpt4o_mini":
|
9 |
+
return gpt4o.GPT4oMini()
|
10 |
+
else:
|
11 |
+
raise NotImplementedError("This type of model is not yet supported")
|
12 |
+
|
13 |
+
|
api/llms/gpt4o_mini.py
ADDED
@@ -0,0 +1,81 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from llama_index.llms.openai import OpenAI
|
2 |
+
from llama_index.core import PromptTemplate, Settings
|
3 |
+
from api.llms.llm_config import LLMConfig
|
4 |
+
from api.llms.key_utils import decrypt_string
|
5 |
+
import os
|
6 |
+
|
7 |
+
# GPT-4o-mini config
|
8 |
+
MODEL = "gpt-4o-mini"
|
9 |
+
USER_KEY = decrypt_string("eMv2Ec77SMKAJOl078Ow9t+5PjCTq6y/8ZgzqkkmO2Rpy50rxedjotRdxWnu04WP0bcWK76zu48=", os.getenv('MY_SECRET_PASSWORD'))
|
10 |
+
REQUEST_TIMEOUT = 100.00
|
11 |
+
CONTEXT_WINDOW = 8000
|
12 |
+
TEMPERATURE = 0
|
13 |
+
TOP_P = 0.2
|
14 |
+
TOP_K = 30
|
15 |
+
|
16 |
+
GPT_SYSTEM_PROMPT = """
|
17 |
+
Bạn là một chuyên gia nông nghiệp có thể trả lời những câu hỏi về kiến thức nông nghiệp, mùa vụ, cây trồng, phân bón,... Dựa vào thông tin được cung cấp, hãy trả lời câu hỏi của người dùng.
|
18 |
+
Ưu tiên sử dụng thông tin được cung cấp và không sử dụng tri thức sẵn có.
|
19 |
+
"""
|
20 |
+
|
21 |
+
GPT_QUERY_CONTEXT_TEMPLATE = PromptTemplate("""Bạn là một chuyên gia nông nghiệp có thể trả lời những câu hỏi về kiến thức nông nghiệp, mùa vụ, cây trồng, phân bón,... Bạn được cung cấp dữ liệu như sau:
|
22 |
+
Dữ liệu: {context_str}
|
23 |
+
|
24 |
+
Chỉ dẫn:
|
25 |
+
Sử dụng thông tin ngữ cảnh đã cho và không sử dụng tri thức sẵn có (not prior knowledge), trả lời những câu hỏi về
|
26 |
+
nông nghiệp, cây trồng, phân bón, bệnh cây trồng,.... một cách rõ ràng và chính xác.
|
27 |
+
Nếu thông tin được cung cấp không liên quan đến câu hỏi hoặc bạn không chắc chắn về câu trả lời của mình, bạn hãy yêu cầu
|
28 |
+
người dùng cung cấp thêm thông tin làm rõ câu hỏi.
|
29 |
+
Nếu không tìm thấy câu trả lời thì cho người dùng biết bạn không thể đưa ra câu trả lời chính xác.
|
30 |
+
KHÔNG sử dụng những kiến thức sẵn có của bạn để kết hợp với những dữ liệu được cung cấp (DO NOT use prior knowledge).
|
31 |
+
Ngôn ngữ trong câu trả lời phải giống với ngôn ngữ trong câu hỏi.
|
32 |
+
Nếu người dùng yêu cầu bạn dịch câu trả lời sang một ngôn ngữ khác thì phải cung cấp câu
|
33 |
+
trả lời bằng ngôn ngữ mà người dùng yêu cầu.
|
34 |
+
Ví dụ nếu người dùng yêu cầu "Dịch câu trả lời sang tiếng Anh" thì câu trả lời phải là nội dung văn bản đã dịch sang tiếng Anh mặc dù người
|
35 |
+
dùng đang hỏi bạn bằng tiếng Việt.
|
36 |
+
Nếu câu hỏi hiện tại liên quan với câu hỏi trước thì có thể sử dụng kết hợp ngữ cảnh câu hỏi trước để trả lời.
|
37 |
+
Nếu câu hỏi hiện tại không liên quan với câu hỏi trước thì không được dùng ngữ cảnh câu hỏi trước để trả lời.
|
38 |
+
|
39 |
+
Câu hỏi: {query_str}
|
40 |
+
Trả lời:""")
|
41 |
+
|
42 |
+
GPT_CHAT_CONDENSE_TEMPLATE = """Đây là lịch sử hội thoại (chat history) giữa người dùng và chat bot, cùng với câu hỏi tiếp theo của người dùng (follow up message).
|
43 |
+
Hãy viết lại cuộc hội thoại trở thành một câu hỏi đơn chứa tóm tắt đầy đủ nội dung cuộc hội thoại.
|
44 |
+
Lịch sử hội thoại:
|
45 |
+
{chat_history}
|
46 |
+
|
47 |
+
Câu hỏi tiếp theo:
|
48 |
+
{question}
|
49 |
+
|
50 |
+
Câu hỏi đơn:
|
51 |
+
"""
|
52 |
+
|
53 |
+
GPT_CHAT_CONTEXT_TEMPLATE = """
|
54 |
+
Cho thông tin như sau:
|
55 |
+
---------------------
|
56 |
+
{context_str}
|
57 |
+
---------------------
|
58 |
+
Chỉ dẫn:
|
59 |
+
Sử dụng thông tin ngữ cảnh đã cho và không sử dụng tri thức sẵn có (not prior knowledge), trả lời những câu hỏi về
|
60 |
+
nông nghiệp, cây trồng, phân bón, bệnh cây trồng,.... một cách rõ ràng và chính xác.
|
61 |
+
Nếu không có thông tin ngữ cảnh (no context provided) thì trả lời là "Tôi không có câu trả lời chính xác cho câu hỏi của bạn".
|
62 |
+
Nếu thông tin được cung cấp không liên quan đến câu hỏi hoặc bạn không chắc chắn về câu trả lời của mình, bạn hãy yêu cầu
|
63 |
+
người dùng cung cấp thêm thông tin làm rõ câu hỏi.
|
64 |
+
Nếu không tìm thấy câu trả lời thì cho người dùng biết bạn không thể đưa ra câu trả lời chính xác.
|
65 |
+
KHÔNG sử dụng những kiến thức sẵn có của bạn để kết hợp với những dữ liệu được cung cấp (DO NOT use prior knowledge).
|
66 |
+
Ngôn ngữ trong câu trả lời phải giống với ngôn ngữ trong câu hỏi.
|
67 |
+
Nếu người dùng yêu cầu bạn dịch câu trả lời sang một ngôn ngữ khác thì phải cung cấp câu trả lời bằng ngôn ngữ mà người dùng yêu cầu.
|
68 |
+
"""
|
69 |
+
|
70 |
+
def GPT4oMini() -> LLMConfig:
|
71 |
+
Settings.llm = OpenAI(model=MODEL,
|
72 |
+
api_key=USER_KEY,
|
73 |
+
request_timeout=REQUEST_TIMEOUT,
|
74 |
+
context_window=CONTEXT_WINDOW,
|
75 |
+
temperature=TEMPERATURE,
|
76 |
+
top_p=TOP_P,
|
77 |
+
top_k=TOP_K)
|
78 |
+
return LLMConfig(system_prompt=GPT_SYSTEM_PROMPT,
|
79 |
+
query_context_template=GPT_QUERY_CONTEXT_TEMPLATE,
|
80 |
+
chat_condense_template = GPT_CHAT_CONDENSE_TEMPLATE,
|
81 |
+
chat_context_template= GPT_CHAT_CONTEXT_TEMPLATE)
|
api/llms/key_utils.py
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import hashlib
|
2 |
+
import base64
|
3 |
+
|
4 |
+
def generate_key(password: str) -> bytes:
|
5 |
+
return hashlib.sha256(password.encode()).digest()
|
6 |
+
|
7 |
+
def xor_bytes(data: bytes, key: bytes) -> bytes:
|
8 |
+
return bytes([b ^ key[i % len(key)] for i, b in enumerate(data)])
|
9 |
+
|
10 |
+
def encrypt_string(plain_text: str, password: str) -> str:
|
11 |
+
key = generate_key(password)
|
12 |
+
plain_bytes = plain_text.encode()
|
13 |
+
encrypted_bytes = xor_bytes(plain_bytes, key)
|
14 |
+
return base64.b64encode(encrypted_bytes).decode()
|
15 |
+
|
16 |
+
def decrypt_string(encrypted_text: str, password: str) -> str:
|
17 |
+
key = generate_key(password)
|
18 |
+
encrypted_bytes = base64.b64decode(encrypted_text)
|
19 |
+
decrypted_bytes = xor_bytes(encrypted_bytes, key)
|
20 |
+
return decrypted_bytes.decode()
|
api/llms/llm_config.py
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
class LLMConfig:
|
2 |
+
def __init__(self,
|
3 |
+
system_prompt,
|
4 |
+
query_context_template,
|
5 |
+
chat_condense_template,
|
6 |
+
chat_context_template,
|
7 |
+
**kwargs
|
8 |
+
):
|
9 |
+
"""
|
10 |
+
system_prompt: act as llm's system instructions
|
11 |
+
query_context_template: used for QueryEngine - single question-answer pairs without chat history
|
12 |
+
chat_condense_template: used for ChatEngine - 'condense' & 'condense_plus_context' mode
|
13 |
+
chat_context_template: used for ChatEngine - 'context' mode
|
14 |
+
**kwargs: additional keyword arguments for other configurations
|
15 |
+
"""
|
16 |
+
self.system_prompt = system_prompt
|
17 |
+
self.query_context_template = query_context_template
|
18 |
+
self.chat_condense_template = chat_condense_template
|
19 |
+
self.chat_context_template = chat_context_template
|
20 |
+
self.kwargs = kwargs
|