Ticio commited on
Commit
2da029a
verified
1 Parent(s): 244f4f7

initial commit

Browse files
Files changed (1) hide show
  1. app.py +134 -0
app.py ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from sentence_transformers import SentenceTransformer
2
+ from together import Together
3
+ import vecs
4
+ import os
5
+ import gradio as gr
6
+
7
+ user = os.getenv("user")
8
+ password = os.getenv("password")
9
+ host = os.getenv("host")
10
+ port = os.getenv("port")
11
+ db_name = "postgres"
12
+ DB_CONNECTION = f"postgresql://{user}:{password}@{host}:{port}/{db_name}"
13
+ vx = vecs.create_client(DB_CONNECTION)
14
+ model = SentenceTransformer('Snowflake/snowflake-arctic-embed-xs')
15
+ client = Together(api_key=os.getenv('TOGETHER_API_KEY'))
16
+
17
+ login_user = os.getenv('login_user')
18
+ login_pass = os.getenv('login_pass')
19
+
20
+ class Ticio():
21
+
22
+ def __init__(self, system_prompt, model = 'meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo'):
23
+ self.model = model
24
+ self.messages = [{'role': 'system', 'content': system_prompt}]
25
+
26
+ def inference(self):
27
+ response = client.chat.completions.create(
28
+ model=self.model,
29
+ messages=self.messages,
30
+ )
31
+ self.messages.append({"role": 'assistant', "content": response.choices[0].message.content})
32
+ return response
33
+
34
+ def add_message(self, content, role):
35
+ self.messages.append({"role": role, "content": content})
36
+ return self.messages
37
+
38
+ def last_inference(self):
39
+ return self.messages[-1]['content']
40
+
41
+ system_prompt = '''Eres Ticio, un asistente de investigaci贸n jur铆dica. Tu objetivo es reponder a las preguntas planteadas por el usuario, sistematizando la informaci贸n de contexto que tengas. Para esto tienes las siguiente funciones:
42
+
43
+ #usa esta funci贸n cuando te hagan preguntas que no puedas responder con la informaci贸n disponible en el contexto, el query es la pregunta del usuario.
44
+ def buscar(query):
45
+ vector = model.encode(query)
46
+ informaci贸n = query_db(vector)
47
+ return informaci貌n
48
+
49
+ cuando quieras usar una funci贸n, responde SOLO con la siguiente sintaxis:
50
+ <tool_call>function(parameters)</tool_call>
51
+
52
+ Siempre debes buscar informaci贸n que no puedas responder directamente con la informaci贸n de contexto que tengas en el chat, si no tienes informaci贸n siempre debes buscar. Cuando tengas la informaci贸n debes responder citando diractamente la informaci贸n
53
+ Debes presentar informaci贸n resumida que ayude a la persona a identificar de forma rapida si un documento le es relevante. SOLO HAZ ESTO DESPUES DE HABER BUSCADO INFORMACI脫N
54
+ '''
55
+ def function_call(calls):
56
+ results = []
57
+ for item in calls:
58
+ a = eval(item)
59
+ results.append(a)
60
+ return results
61
+
62
+ def parse_call(output):
63
+ token = '<tool_call>'
64
+ token2= '</tool_call>'
65
+
66
+ calls = []
67
+ if token in output:
68
+ split = output.split(token)
69
+ for item in split:
70
+ if token2 in item:
71
+ calls.append(item.split(token2)[0])
72
+ return calls
73
+
74
+ def query_db(query, limit = 5, filters = {}, measure = "cosine_distance", include_value = True, include_metadata=True, table = "CE"):
75
+ query_embeds = vx.get_or_create_collection(name= table, dimension=384)
76
+ ans = query_embeds.query(
77
+ data=query,
78
+ limit=limit,
79
+ filters=filters,
80
+ measure=measure,
81
+ include_value=include_value,
82
+ include_metadata=include_metadata,
83
+ )
84
+ return ans
85
+
86
+ def sort_by_score(item):
87
+ return item[1]
88
+
89
+ def construct_result(ans):
90
+ ans.sort(key=sort_by_score, reverse=True)
91
+ results = ""
92
+ for i in range(0, len(ans)):
93
+ a, b = ans[i][2].get("documento"), ans[i][2].get("fragmento")
94
+ results += (f"En el documento {a}, se dijo {b}\n")
95
+ return results
96
+
97
+
98
+ def buscar(query):
99
+ results = query_db(model.encode(query))
100
+ return construct_result(results)
101
+
102
+
103
+ def inference(message, history):
104
+ ticio = Ticio(system_prompt)
105
+ ticio.add_message(message, 'user')
106
+ for message in history:
107
+ content = message.get('content')
108
+ role = message.get('role')
109
+ ticio.add_message(content, role)
110
+ ticio.inference()
111
+ response = ticio.last_inference()
112
+ calls = parse_call(response)
113
+ if calls:
114
+ results = function_call(calls)
115
+ for result in results:
116
+ ticio.add_message(result, 'assistant')
117
+ ticio.add_message(message, 'user')
118
+ ticio.inference()
119
+ return ticio.last_inference()
120
+ else:
121
+ return response
122
+
123
+ theme = gr.themes.Base(
124
+ primary_hue="red",
125
+ secondary_hue="red",
126
+ neutral_hue="neutral",
127
+ ).set(
128
+ button_primary_background_fill='#910A0A',
129
+ button_primary_border_color='*primary_300',
130
+ button_primary_text_color='*primary_50'
131
+ )
132
+
133
+ demo = gr.ChatInterface(fn=inference, type="messages", examples=["驴Qu茅 se ha dicho acerca de la expresi贸n 'devengado' cuando la usa la UGPP?"], title="Ticio", theme=theme)
134
+ demo.launch(auth=[login_user, login_pass])