Spaces:
Sleeping
Sleeping
Xiaosu Hu
commited on
Commit
·
afe1590
1
Parent(s):
0126af1
update: different ollama models
Browse files- modules/llm_in_use.py +3 -1
- paintrek-chat-v2.ipynb +15 -87
- requirements.txt +0 -1
- test_ollama.ipynb +172 -0
modules/llm_in_use.py
CHANGED
@@ -13,7 +13,9 @@ def get_llm():
|
|
13 |
|
14 |
# llm = ChatOpenAI(temperature=0)
|
15 |
|
16 |
-
llm = ChatOllama(model="llama3.2:
|
|
|
|
|
17 |
|
18 |
# llm = ChatGoogleGenerativeAI(model="gemini-1.5-flash-latest")
|
19 |
|
|
|
13 |
|
14 |
# llm = ChatOpenAI(temperature=0)
|
15 |
|
16 |
+
llm = ChatOllama(model="llama3.2:3b", temperature=0, base_url="http://141.211.127.171")
|
17 |
+
# llm = ChatOllama(model="qwen2.5:14b", temperature=0, base_url="http://141.211.127.171")
|
18 |
+
# llm = ChatOllama(model="nexusraven:13b", temperature=0, base_url="http://141.211.127.171")
|
19 |
|
20 |
# llm = ChatGoogleGenerativeAI(model="gemini-1.5-flash-latest")
|
21 |
|
paintrek-chat-v2.ipynb
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
"cells": [
|
3 |
{
|
4 |
"cell_type": "code",
|
5 |
-
"execution_count":
|
6 |
"metadata": {
|
7 |
"execution": {
|
8 |
"iopub.execute_input": "2025-01-29T20:09:11.440091Z",
|
@@ -14,16 +14,7 @@
|
|
14 |
"id": "xaiioUQni_ga",
|
15 |
"trusted": true
|
16 |
},
|
17 |
-
"outputs": [
|
18 |
-
{
|
19 |
-
"name": "stderr",
|
20 |
-
"output_type": "stream",
|
21 |
-
"text": [
|
22 |
-
"/home/frank-elite/miniconda3/envs/paintrekbot/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
|
23 |
-
" from .autonotebook import tqdm as notebook_tqdm\n"
|
24 |
-
]
|
25 |
-
}
|
26 |
-
],
|
27 |
"source": [
|
28 |
"from modules.data_class import DataState\n",
|
29 |
"from modules.tools import data_node\n",
|
@@ -45,7 +36,7 @@
|
|
45 |
},
|
46 |
{
|
47 |
"cell_type": "code",
|
48 |
-
"execution_count":
|
49 |
"metadata": {
|
50 |
"execution": {
|
51 |
"iopub.execute_input": "2025-01-29T20:09:11.906458Z",
|
@@ -57,19 +48,7 @@
|
|
57 |
"id": "9rqkQzlZxrzp",
|
58 |
"trusted": true
|
59 |
},
|
60 |
-
"outputs": [
|
61 |
-
{
|
62 |
-
"data": {
|
63 |
-
"image/png": "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",
|
64 |
-
"text/plain": [
|
65 |
-
"<IPython.core.display.Image object>"
|
66 |
-
]
|
67 |
-
},
|
68 |
-
"execution_count": 2,
|
69 |
-
"metadata": {},
|
70 |
-
"output_type": "execute_result"
|
71 |
-
}
|
72 |
-
],
|
73 |
"source": [
|
74 |
"graph_builder = StateGraph(DataState)\n",
|
75 |
"memory = MemorySaver()\n",
|
@@ -95,7 +74,7 @@
|
|
95 |
},
|
96 |
{
|
97 |
"cell_type": "code",
|
98 |
-
"execution_count":
|
99 |
"metadata": {
|
100 |
"execution": {
|
101 |
"iopub.execute_input": "2025-01-29T20:09:38.185616Z",
|
@@ -107,65 +86,7 @@
|
|
107 |
"id": "NCRSgaBUfIHF",
|
108 |
"trusted": true
|
109 |
},
|
110 |
-
"outputs": [
|
111 |
-
{
|
112 |
-
"name": "stdout",
|
113 |
-
"output_type": "stream",
|
114 |
-
"text": [
|
115 |
-
"Executing the chatbot graph...\n",
|
116 |
-
"Model: Welcome to the Paintrek world. I am a health assistant, an interactive clinical recording system. I will ask you questions about your pain and related symptoms and record your responses. I will then store this information securely. At any time, you can type `q` to quit.\n",
|
117 |
-
"User: Hello\n",
|
118 |
-
"Model: I'm MedAssist, your intelligent medical intake system. I'll guide you through a structured data collection process to gather comprehensive patient information.\n",
|
119 |
-
"\n",
|
120 |
-
"To begin, can you please tell me your name and date of birth? This will help me identify you in our records and ensure accurate communication throughout the process.\n",
|
121 |
-
"User: \n",
|
122 |
-
"Model: Here is the JSON payload that can be sent to the server to collect all the necessary information:\n",
|
123 |
-
"\n",
|
124 |
-
"```json\n",
|
125 |
-
"{\n",
|
126 |
-
" \"name\": \"\",\n",
|
127 |
-
" \"family_hist\": \"\",\n",
|
128 |
-
" \"social_hist\": {\n",
|
129 |
-
" \"occupation\": \"\",\n",
|
130 |
-
" \"smoke\": false,\n",
|
131 |
-
" \"alcohol\": false,\n",
|
132 |
-
" \"drug\": false,\n",
|
133 |
-
" \"support_system\": \"\",\n",
|
134 |
-
" \"living_condition\": \"\"\n",
|
135 |
-
" },\n",
|
136 |
-
" \"pain_manage\": {\n",
|
137 |
-
" \"pain_medication\": \"\",\n",
|
138 |
-
" \"specialist\": false,\n",
|
139 |
-
" \"other_therapy\": \"\",\n",
|
140 |
-
" \"effectiveness\": false\n",
|
141 |
-
" },\n",
|
142 |
-
" \"functional\": {\n",
|
143 |
-
" \"life_quality\": \"\",\n",
|
144 |
-
" \"limit_activity\": \"\",\n",
|
145 |
-
" \"mood\": \"\"\n",
|
146 |
-
" },\n",
|
147 |
-
" \"plan\": {\n",
|
148 |
-
" \"goal\": \"\",\n",
|
149 |
-
" \"expectation\": \"\",\n",
|
150 |
-
" \"alternative_treatment\": \"\"\n",
|
151 |
-
" },\n",
|
152 |
-
" \"review_system\": {\n",
|
153 |
-
" \"weight_change\": \"\",\n",
|
154 |
-
" \"fever\": false,\n",
|
155 |
-
" \"chill\": false,\n",
|
156 |
-
" \"night_sweats\": false,\n",
|
157 |
-
" \"sleep\": \"\",\n",
|
158 |
-
" \"gastrointestinal\": \"\",\n",
|
159 |
-
" \"urinary\": \"\"\n",
|
160 |
-
" }\n",
|
161 |
-
"}\n",
|
162 |
-
"```\n",
|
163 |
-
"\n",
|
164 |
-
"This payload includes all the necessary fields to collect information about the patient's family history, social history, pain management, functional assessment, and review system. Note that some of these fields are optional (e.g., `smoke`, `alcohol`, etc.) and can be set to `false` if not applicable.\n",
|
165 |
-
"User: q\n"
|
166 |
-
]
|
167 |
-
}
|
168 |
-
],
|
169 |
"source": [
|
170 |
"# This is for the checkpointer to have a thread id to remember for each user, and I don't know if letter mix with number will work here \n",
|
171 |
"# The default recursion limit for traversing nodes is 25 - setting it higher means you can try a more complex order with multiple steps and round-trips.\n",
|
@@ -194,6 +115,13 @@
|
|
194 |
"source": [
|
195 |
"state[\"data\"]"
|
196 |
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
197 |
}
|
198 |
],
|
199 |
"metadata": {
|
@@ -211,7 +139,7 @@
|
|
211 |
"sourceType": "notebook"
|
212 |
},
|
213 |
"kernelspec": {
|
214 |
-
"display_name": "
|
215 |
"language": "python",
|
216 |
"name": "python3"
|
217 |
},
|
@@ -225,7 +153,7 @@
|
|
225 |
"name": "python",
|
226 |
"nbconvert_exporter": "python",
|
227 |
"pygments_lexer": "ipython3",
|
228 |
-
"version": "3.
|
229 |
}
|
230 |
},
|
231 |
"nbformat": 4,
|
|
|
2 |
"cells": [
|
3 |
{
|
4 |
"cell_type": "code",
|
5 |
+
"execution_count": null,
|
6 |
"metadata": {
|
7 |
"execution": {
|
8 |
"iopub.execute_input": "2025-01-29T20:09:11.440091Z",
|
|
|
14 |
"id": "xaiioUQni_ga",
|
15 |
"trusted": true
|
16 |
},
|
17 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
"source": [
|
19 |
"from modules.data_class import DataState\n",
|
20 |
"from modules.tools import data_node\n",
|
|
|
36 |
},
|
37 |
{
|
38 |
"cell_type": "code",
|
39 |
+
"execution_count": null,
|
40 |
"metadata": {
|
41 |
"execution": {
|
42 |
"iopub.execute_input": "2025-01-29T20:09:11.906458Z",
|
|
|
48 |
"id": "9rqkQzlZxrzp",
|
49 |
"trusted": true
|
50 |
},
|
51 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
"source": [
|
53 |
"graph_builder = StateGraph(DataState)\n",
|
54 |
"memory = MemorySaver()\n",
|
|
|
74 |
},
|
75 |
{
|
76 |
"cell_type": "code",
|
77 |
+
"execution_count": null,
|
78 |
"metadata": {
|
79 |
"execution": {
|
80 |
"iopub.execute_input": "2025-01-29T20:09:38.185616Z",
|
|
|
86 |
"id": "NCRSgaBUfIHF",
|
87 |
"trusted": true
|
88 |
},
|
89 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
"source": [
|
91 |
"# This is for the checkpointer to have a thread id to remember for each user, and I don't know if letter mix with number will work here \n",
|
92 |
"# The default recursion limit for traversing nodes is 25 - setting it higher means you can try a more complex order with multiple steps and round-trips.\n",
|
|
|
115 |
"source": [
|
116 |
"state[\"data\"]"
|
117 |
]
|
118 |
+
},
|
119 |
+
{
|
120 |
+
"cell_type": "code",
|
121 |
+
"execution_count": null,
|
122 |
+
"metadata": {},
|
123 |
+
"outputs": [],
|
124 |
+
"source": []
|
125 |
}
|
126 |
],
|
127 |
"metadata": {
|
|
|
139 |
"sourceType": "notebook"
|
140 |
},
|
141 |
"kernelspec": {
|
142 |
+
"display_name": "paintrek",
|
143 |
"language": "python",
|
144 |
"name": "python3"
|
145 |
},
|
|
|
153 |
"name": "python",
|
154 |
"nbconvert_exporter": "python",
|
155 |
"pygments_lexer": "ipython3",
|
156 |
+
"version": "3.10.14"
|
157 |
}
|
158 |
},
|
159 |
"nbformat": 4,
|
requirements.txt
CHANGED
@@ -45,7 +45,6 @@ langgraph-sdk==0.1.51
|
|
45 |
langsmith==0.3.3
|
46 |
matplotlib==3.10.0
|
47 |
matplotlib-inline
|
48 |
-
mkl-service==2.4.0
|
49 |
msgpack==1.1.0
|
50 |
multidict==6.1.0
|
51 |
numpy==1.26.4
|
|
|
45 |
langsmith==0.3.3
|
46 |
matplotlib==3.10.0
|
47 |
matplotlib-inline
|
|
|
48 |
msgpack==1.1.0
|
49 |
multidict==6.1.0
|
50 |
numpy==1.26.4
|
test_ollama.ipynb
ADDED
@@ -0,0 +1,172 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 7,
|
6 |
+
"metadata": {},
|
7 |
+
"outputs": [],
|
8 |
+
"source": [
|
9 |
+
"from modules.llm_in_use import get_llm\n",
|
10 |
+
"from langchain_ollama import ChatOllama\n"
|
11 |
+
]
|
12 |
+
},
|
13 |
+
{
|
14 |
+
"cell_type": "code",
|
15 |
+
"execution_count": 2,
|
16 |
+
"metadata": {},
|
17 |
+
"outputs": [],
|
18 |
+
"source": [
|
19 |
+
"llm = get_llm()"
|
20 |
+
]
|
21 |
+
},
|
22 |
+
{
|
23 |
+
"cell_type": "code",
|
24 |
+
"execution_count": 3,
|
25 |
+
"metadata": {},
|
26 |
+
"outputs": [
|
27 |
+
{
|
28 |
+
"data": {
|
29 |
+
"text/plain": [
|
30 |
+
"AIMessage(content='Je aime le programmation.', additional_kwargs={}, response_metadata={'model': 'llama3.2:3b', 'created_at': '2025-03-03T20:22:10.986078Z', 'done': True, 'done_reason': 'stop', 'total_duration': 564767250, 'load_duration': 36439292, 'prompt_eval_count': 45, 'prompt_eval_duration': 207000000, 'eval_count': 7, 'eval_duration': 45000000, 'message': Message(role='assistant', content='', images=None, tool_calls=None)}, id='run-b473d2e4-5ea8-49c1-880c-57529bab3be3-0', usage_metadata={'input_tokens': 45, 'output_tokens': 7, 'total_tokens': 52})"
|
31 |
+
]
|
32 |
+
},
|
33 |
+
"execution_count": 3,
|
34 |
+
"metadata": {},
|
35 |
+
"output_type": "execute_result"
|
36 |
+
}
|
37 |
+
],
|
38 |
+
"source": [
|
39 |
+
"from langchain_core.messages import AIMessage\n",
|
40 |
+
"\n",
|
41 |
+
"messages = [\n",
|
42 |
+
" (\n",
|
43 |
+
" \"system\",\n",
|
44 |
+
" \"You are a helpful assistant that translates English to French. Translate the user sentence.\",\n",
|
45 |
+
" ),\n",
|
46 |
+
" (\"human\", \"I love programming.\"),\n",
|
47 |
+
"]\n",
|
48 |
+
"ai_msg = llm.invoke(messages)\n",
|
49 |
+
"ai_msg"
|
50 |
+
]
|
51 |
+
},
|
52 |
+
{
|
53 |
+
"cell_type": "code",
|
54 |
+
"execution_count": 4,
|
55 |
+
"metadata": {},
|
56 |
+
"outputs": [
|
57 |
+
{
|
58 |
+
"data": {
|
59 |
+
"text/plain": [
|
60 |
+
"AIMessage(content='Ich liebe Programmierung.', additional_kwargs={}, response_metadata={'model': 'llama3.2:3b', 'created_at': '2025-03-03T20:27:19.219749Z', 'done': True, 'done_reason': 'stop', 'total_duration': 1047082250, 'load_duration': 580482958, 'prompt_eval_count': 40, 'prompt_eval_duration': 161000000, 'eval_count': 6, 'eval_duration': 38000000, 'message': Message(role='assistant', content='', images=None, tool_calls=None)}, id='run-bbaf365e-81ba-4928-b6a3-8578efe20cc5-0', usage_metadata={'input_tokens': 40, 'output_tokens': 6, 'total_tokens': 46})"
|
61 |
+
]
|
62 |
+
},
|
63 |
+
"execution_count": 4,
|
64 |
+
"metadata": {},
|
65 |
+
"output_type": "execute_result"
|
66 |
+
}
|
67 |
+
],
|
68 |
+
"source": [
|
69 |
+
"from langchain_core.prompts import ChatPromptTemplate\n",
|
70 |
+
"\n",
|
71 |
+
"prompt = ChatPromptTemplate.from_messages(\n",
|
72 |
+
" [\n",
|
73 |
+
" (\n",
|
74 |
+
" \"system\",\n",
|
75 |
+
" \"You are a helpful assistant that translates {input_language} to {output_language}.\",\n",
|
76 |
+
" ),\n",
|
77 |
+
" (\"human\", \"{input}\"),\n",
|
78 |
+
" ]\n",
|
79 |
+
")\n",
|
80 |
+
"\n",
|
81 |
+
"chain = prompt | llm\n",
|
82 |
+
"chain.invoke(\n",
|
83 |
+
" {\n",
|
84 |
+
" \"input_language\": \"English\",\n",
|
85 |
+
" \"output_language\": \"German\",\n",
|
86 |
+
" \"input\": \"I love programming.\",\n",
|
87 |
+
" }\n",
|
88 |
+
")"
|
89 |
+
]
|
90 |
+
},
|
91 |
+
{
|
92 |
+
"cell_type": "code",
|
93 |
+
"execution_count": 8,
|
94 |
+
"metadata": {},
|
95 |
+
"outputs": [
|
96 |
+
{
|
97 |
+
"data": {
|
98 |
+
"text/plain": [
|
99 |
+
"[{'name': 'validate_user',\n",
|
100 |
+
" 'args': {'addresses': ['123 Fake St', '234 Pretend Boulevard'],\n",
|
101 |
+
" 'user_id': 123},\n",
|
102 |
+
" 'id': '0401ef59-16fb-446c-8fa2-11c2ad671d44',\n",
|
103 |
+
" 'type': 'tool_call'}]"
|
104 |
+
]
|
105 |
+
},
|
106 |
+
"execution_count": 8,
|
107 |
+
"metadata": {},
|
108 |
+
"output_type": "execute_result"
|
109 |
+
}
|
110 |
+
],
|
111 |
+
"source": [
|
112 |
+
"from typing import List\n",
|
113 |
+
"\n",
|
114 |
+
"from langchain_core.tools import tool\n",
|
115 |
+
"from langchain_ollama import ChatOllama\n",
|
116 |
+
"\n",
|
117 |
+
"\n",
|
118 |
+
"@tool\n",
|
119 |
+
"def validate_user(user_id: int, addresses: List[str]) -> bool:\n",
|
120 |
+
" \"\"\"Validate user using historical addresses.\n",
|
121 |
+
"\n",
|
122 |
+
" Args:\n",
|
123 |
+
" user_id (int): the user ID.\n",
|
124 |
+
" addresses (List[str]): Previous addresses as a list of strings.\n",
|
125 |
+
" \"\"\"\n",
|
126 |
+
" return True\n",
|
127 |
+
"\n",
|
128 |
+
"\n",
|
129 |
+
"llm = ChatOllama(\n",
|
130 |
+
" model=\"llama3.2\",\n",
|
131 |
+
" temperature=0,\n",
|
132 |
+
" base_url=\"http://141.211.127.171\"\n",
|
133 |
+
").bind_tools([validate_user])\n",
|
134 |
+
"\n",
|
135 |
+
"result = llm.invoke(\n",
|
136 |
+
" \"Could you validate user 123? They previously lived at \"\n",
|
137 |
+
" \"123 Fake St in Boston MA and 234 Pretend Boulevard in \"\n",
|
138 |
+
" \"Houston TX.\"\n",
|
139 |
+
")\n",
|
140 |
+
"result.tool_calls"
|
141 |
+
]
|
142 |
+
},
|
143 |
+
{
|
144 |
+
"cell_type": "code",
|
145 |
+
"execution_count": null,
|
146 |
+
"metadata": {},
|
147 |
+
"outputs": [],
|
148 |
+
"source": []
|
149 |
+
}
|
150 |
+
],
|
151 |
+
"metadata": {
|
152 |
+
"kernelspec": {
|
153 |
+
"display_name": "paintrek",
|
154 |
+
"language": "python",
|
155 |
+
"name": "python3"
|
156 |
+
},
|
157 |
+
"language_info": {
|
158 |
+
"codemirror_mode": {
|
159 |
+
"name": "ipython",
|
160 |
+
"version": 3
|
161 |
+
},
|
162 |
+
"file_extension": ".py",
|
163 |
+
"mimetype": "text/x-python",
|
164 |
+
"name": "python",
|
165 |
+
"nbconvert_exporter": "python",
|
166 |
+
"pygments_lexer": "ipython3",
|
167 |
+
"version": "3.10.14"
|
168 |
+
}
|
169 |
+
},
|
170 |
+
"nbformat": 4,
|
171 |
+
"nbformat_minor": 2
|
172 |
+
}
|