fsal commited on
Commit
1488b2a
1 Parent(s): b494fdf

functioning version

Browse files
langchain-streamlit-demo/app.py CHANGED
@@ -6,7 +6,6 @@ import langsmith.utils
6
  import openai
7
  import streamlit as st
8
  from defaults import default_values
9
- from langchain.agents import load_tools
10
  from langchain.agents.tools import tool
11
  from langchain.callbacks.base import BaseCallbackHandler
12
  from langchain.callbacks.manager import Callbacks
@@ -17,11 +16,9 @@ from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
17
  from langchain.schema.document import Document
18
  from langchain.schema.retriever import BaseRetriever
19
  from langchain_community.callbacks import StreamlitCallbackHandler
20
- from langchain_community.tools import DuckDuckGoSearchRun, WikipediaQueryRun
21
- from langchain_community.utilities import WikipediaAPIWrapper
22
  from langsmith.client import Client
23
  from llm_resources import (
24
- get_agent,
25
  get_doc_agent,
26
  get_llm,
27
  get_runnable,
@@ -168,7 +165,7 @@ with sidebar:
168
  index=default_values.SUPPORTED_MODELS.index(default_values.DEFAULT_MODEL),
169
  )
170
 
171
- st.session_state.provider = default_values.MODEL_DICT[model]
172
 
173
  provider_api_key = (
174
  default_values.PROVIDER_KEY_DICT.get(
@@ -198,11 +195,12 @@ with sidebar:
198
  or st.sidebar.text_input("OpenAI API Key: ", type="password")
199
  )
200
 
201
- document_chat = st.checkbox(
202
- "Document Chat",
203
- value=True if uploaded_file else False,
204
- help="Uploaded document will provide context for the chat.",
205
- )
 
206
 
207
  k = st.slider(
208
  label="Number of Chunks",
@@ -285,7 +283,7 @@ with sidebar:
285
  # --- Advanced Settings ---
286
  with st.expander("Advanced Settings", expanded=False):
287
  st.markdown("## Feedback Scale")
288
- use_faces = st.toggle(label="`Thumbs` ⇄ `Faces`", value=False)
289
  feedback_option = "faces" if use_faces else "thumbs"
290
 
291
  system_prompt = (
@@ -447,23 +445,23 @@ if st.session_state.llm:
447
  config["max_concurrency"] = 5
448
  return config
449
 
450
- use_document_chat = all(
451
- [
452
- document_chat,
453
- st.session_state.retriever,
454
- ],
455
- )
456
 
457
  full_response: Union[str, None] = None
458
  # stream_handler = StreamHandler(message_placeholder)
459
  # callbacks.append(stream_handler)
460
  message_placeholder = st.empty()
461
  default_tools = [
462
- DuckDuckGoSearchRun(),
463
- WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper()),
464
  ]
465
- default_tools += load_tools(["requests_get"])
466
- default_tools += load_tools(["llm-math"], llm=st.session_state.llm)
467
  if st.session_state.provider in ("Azure OpenAI", "OpenAI"):
468
  # research_assistant_chain = get_research_assistant_chain(
469
  # search_llm=get_llm(**get_llm_args_temp_zero), # type: ignore
@@ -499,52 +497,52 @@ if st.session_state.llm:
499
  TOOLS = default_tools
500
  # [research_assistant_tool, python_coder_tool] + default_tools
501
 
502
- if use_document_chat:
503
- st.session_state.doc_chain = get_runnable(
504
- use_document_chat,
505
- document_chat_chain_type,
506
- st.session_state.llm,
507
- st.session_state.retriever,
508
- MEMORY,
509
- chat_prompt,
510
- prompt,
 
 
 
 
 
 
 
 
511
  )
512
 
513
- @tool("user-document-chat")
514
- def doc_chain_tool(input_str: str, callbacks: Callbacks = None):
515
- """Always use this tool at least once. Input should be a question."""
516
- return st.session_state.doc_chain.invoke(
517
- input_str,
518
- config=get_config(callbacks),
519
- )
520
 
521
- doc_chain_agent = get_doc_agent(
522
- [doc_chain_tool],
 
 
 
 
 
 
 
 
523
  )
524
 
525
- @tool("document-question-tool")
526
- def doc_question_tool(input_str: str, callbacks: Callbacks = None):
527
- """This tool is an AI assistant with access to the user's uploaded document.
528
- Input should be one or more questions, requests, instructions, etc.
529
- If the user's meaning is unclear, perhaps the answer is here.
530
- Generally speaking, try this tool before conducting web research.
531
- """
532
- return doc_chain_agent.invoke(
533
- input_str,
534
- config=get_config(callbacks),
535
- )
536
-
537
- TOOLS = [doc_question_tool] + TOOLS
538
-
539
- st.session_state.chain = get_agent(
540
- TOOLS,
541
- STMEMORY,
542
- st.session_state.llm,
543
- callbacks,
544
- )
545
- else:
546
  st.session_state.chain = get_runnable(
547
- use_document_chat,
548
  document_chat_chain_type,
549
  st.session_state.llm,
550
  st.session_state.retriever,
 
6
  import openai
7
  import streamlit as st
8
  from defaults import default_values
 
9
  from langchain.agents.tools import tool
10
  from langchain.callbacks.base import BaseCallbackHandler
11
  from langchain.callbacks.manager import Callbacks
 
16
  from langchain.schema.document import Document
17
  from langchain.schema.retriever import BaseRetriever
18
  from langchain_community.callbacks import StreamlitCallbackHandler
 
 
19
  from langsmith.client import Client
20
  from llm_resources import (
21
+ # get_agent,
22
  get_doc_agent,
23
  get_llm,
24
  get_runnable,
 
165
  index=default_values.SUPPORTED_MODELS.index(default_values.DEFAULT_MODEL),
166
  )
167
 
168
+ st.session_state.provider = "OpenAI" # default_values.MODEL_DICT[model]
169
 
170
  provider_api_key = (
171
  default_values.PROVIDER_KEY_DICT.get(
 
195
  or st.sidebar.text_input("OpenAI API Key: ", type="password")
196
  )
197
 
198
+ document_chat = True
199
+ # st.checkbox(
200
+ # "Document Chat",
201
+ # value=True if uploaded_file else False,
202
+ # help="Uploaded document will provide context for the chat.",
203
+ # )
204
 
205
  k = st.slider(
206
  label="Number of Chunks",
 
283
  # --- Advanced Settings ---
284
  with st.expander("Advanced Settings", expanded=False):
285
  st.markdown("## Feedback Scale")
286
+ use_faces = False # st.toggle(label="`Thumbs` ⇄ `Faces`", value=False)
287
  feedback_option = "faces" if use_faces else "thumbs"
288
 
289
  system_prompt = (
 
445
  config["max_concurrency"] = 5
446
  return config
447
 
448
+ # use_document_chat = all(
449
+ # [
450
+ # document_chat,
451
+ # st.session_state.retriever,
452
+ # ],
453
+ # )
454
 
455
  full_response: Union[str, None] = None
456
  # stream_handler = StreamHandler(message_placeholder)
457
  # callbacks.append(stream_handler)
458
  message_placeholder = st.empty()
459
  default_tools = [
460
+ # DuckDuckGoSearchRun(),
461
+ # WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper()),
462
  ]
463
+ # default_tools += load_tools(["requests_get"])
464
+ # default_tools += load_tools(["llm-math"], llm=st.session_state.llm)
465
  if st.session_state.provider in ("Azure OpenAI", "OpenAI"):
466
  # research_assistant_chain = get_research_assistant_chain(
467
  # search_llm=get_llm(**get_llm_args_temp_zero), # type: ignore
 
497
  TOOLS = default_tools
498
  # [research_assistant_tool, python_coder_tool] + default_tools
499
 
500
+ # if use_document_chat:
501
+ st.session_state.doc_chain = get_runnable(
502
+ True, # use_document_chat,
503
+ document_chat_chain_type,
504
+ st.session_state.llm,
505
+ st.session_state.retriever,
506
+ MEMORY,
507
+ chat_prompt,
508
+ prompt,
509
+ )
510
+
511
+ @tool("user-document-chat")
512
+ def doc_chain_tool(input_str: str, callbacks: Callbacks = None):
513
+ """Always use this tool at least once. Input should be a question."""
514
+ return st.session_state.doc_chain.invoke(
515
+ input_str,
516
+ config=get_config(callbacks),
517
  )
518
 
519
+ doc_chain_agent = get_doc_agent(
520
+ [doc_chain_tool],
521
+ )
 
 
 
 
522
 
523
+ @tool("document-question-tool")
524
+ def doc_question_tool(input_str: str, callbacks: Callbacks = None):
525
+ """This tool is an AI assistant with access to the user's uploaded document.
526
+ Input should be one or more questions, requests, instructions, etc.
527
+ If the user's meaning is unclear, perhaps the answer is here.
528
+ Generally speaking, try this tool before conducting web research.
529
+ """
530
+ return doc_chain_agent.invoke(
531
+ input_str,
532
+ config=get_config(callbacks),
533
  )
534
 
535
+ TOOLS = [doc_question_tool] + TOOLS
536
+
537
+ # st.session_state.chain = get_agent(
538
+ # TOOLS,
539
+ # STMEMORY,
540
+ # st.session_state.llm,
541
+ # callbacks,
542
+ # )
543
+ # else:
 
 
 
 
 
 
 
 
 
 
 
 
544
  st.session_state.chain = get_runnable(
545
+ True, # use_document_chat,
546
  document_chat_chain_type,
547
  st.session_state.llm,
548
  st.session_state.retriever,
langchain-streamlit-demo/defaults.py CHANGED
@@ -6,17 +6,17 @@ MODEL_DICT = {
6
  "gpt-4": "OpenAI",
7
  "gpt-4-turbo-preview": "OpenAI",
8
  "gpt-4-1106-preview": "OpenAI",
9
- "claude-instant-1": "Anthropic",
10
- "claude-instant-1.2": "Anthropic",
11
- "claude-2": "Anthropic",
12
- "claude-2.1": "Anthropic",
13
- "meta-llama/Llama-2-7b-chat-hf": "Anyscale Endpoints",
14
- "meta-llama/Llama-2-13b-chat-hf": "Anyscale Endpoints",
15
- "meta-llama/Llama-2-70b-chat-hf": "Anyscale Endpoints",
16
- "codellama/CodeLlama-34b-Instruct-hf": "Anyscale Endpoints",
17
- "mistralai/Mistral-7B-Instruct-v0.1": "Anyscale Endpoints",
18
- "HuggingFaceH4/zephyr-7b-beta": "Anyscale Endpoints",
19
- "Azure OpenAI": "Azure OpenAI",
20
  }
21
 
22
  SUPPORTED_MODELS = list(MODEL_DICT.keys())
@@ -28,7 +28,7 @@ DEFAULT_SYSTEM_PROMPT = os.environ.get(
28
  # "You are a helpful chatbot. Do not rush. Always plan, think, and act in a step-by-step manner.",
29
  """
30
  Comportati come un operatore di call center.
31
- Hai accesso a tutte le informazioni necessarie per rispondere alle domande dei clienti tramite il vectorstore.
32
  Se non sai rispondere ad una domanda, rispondi che non hai la risposta e offri di connettere il cliente con un operatore umano.
33
  Rispondi in italiano, usando uno stile amichevole ma formale.
34
  """,
@@ -36,11 +36,11 @@ DEFAULT_SYSTEM_PROMPT = os.environ.get(
36
 
37
  MIN_TEMP = float(os.environ.get("MIN_TEMPERATURE", 0.0))
38
  MAX_TEMP = float(os.environ.get("MAX_TEMPERATURE", 1.0))
39
- DEFAULT_TEMP = float(os.environ.get("DEFAULT_TEMPERATURE", 0.7))
40
 
41
  MIN_MAX_TOKENS = int(os.environ.get("MIN_MAX_TOKENS", 1))
42
- MAX_MAX_TOKENS = int(os.environ.get("MAX_MAX_TOKENS", 100000))
43
- DEFAULT_MAX_TOKENS = int(os.environ.get("DEFAULT_MAX_TOKENS", 1000))
44
 
45
  DEFAULT_LANGSMITH_PROJECT = os.environ.get("LANGCHAIN_PROJECT")
46
 
 
6
  "gpt-4": "OpenAI",
7
  "gpt-4-turbo-preview": "OpenAI",
8
  "gpt-4-1106-preview": "OpenAI",
9
+ # "claude-instant-1": "Anthropic",
10
+ # "claude-instant-1.2": "Anthropic",
11
+ # "claude-2": "Anthropic",
12
+ # "claude-2.1": "Anthropic",
13
+ # "meta-llama/Llama-2-7b-chat-hf": "Anyscale Endpoints",
14
+ # "meta-llama/Llama-2-13b-chat-hf": "Anyscale Endpoints",
15
+ # "meta-llama/Llama-2-70b-chat-hf": "Anyscale Endpoints",
16
+ # "codellama/CodeLlama-34b-Instruct-hf": "Anyscale Endpoints",
17
+ # "mistralai/Mistral-7B-Instruct-v0.1": "Anyscale Endpoints",
18
+ # "HuggingFaceH4/zephyr-7b-beta": "Anyscale Endpoints",
19
+ # "Azure OpenAI": "Azure OpenAI",
20
  }
21
 
22
  SUPPORTED_MODELS = list(MODEL_DICT.keys())
 
28
  # "You are a helpful chatbot. Do not rush. Always plan, think, and act in a step-by-step manner.",
29
  """
30
  Comportati come un operatore di call center.
31
+ Hai accesso a tutte le informazioni necessarie per rispondere alle domande dei clienti tramite il tool 'document-question-tool'.
32
  Se non sai rispondere ad una domanda, rispondi che non hai la risposta e offri di connettere il cliente con un operatore umano.
33
  Rispondi in italiano, usando uno stile amichevole ma formale.
34
  """,
 
36
 
37
  MIN_TEMP = float(os.environ.get("MIN_TEMPERATURE", 0.0))
38
  MAX_TEMP = float(os.environ.get("MAX_TEMPERATURE", 1.0))
39
+ DEFAULT_TEMP = float(os.environ.get("DEFAULT_TEMPERATURE", 0.0))
40
 
41
  MIN_MAX_TOKENS = int(os.environ.get("MIN_MAX_TOKENS", 1))
42
+ MAX_MAX_TOKENS = int(os.environ.get("MAX_MAX_TOKENS", 1000))
43
+ DEFAULT_MAX_TOKENS = int(os.environ.get("DEFAULT_MAX_TOKENS", 300))
44
 
45
  DEFAULT_LANGSMITH_PROJECT = os.environ.get("LANGCHAIN_PROJECT")
46
 
langchain-streamlit-demo/llm_resources.py CHANGED
@@ -6,7 +6,7 @@ from defaults import DEFAULT_CHUNK_OVERLAP, DEFAULT_CHUNK_SIZE, DEFAULT_RETRIEVE
6
  from langchain.agents import AgentExecutor, AgentType, initialize_agent
7
  from langchain.agents.openai_functions_agent.base import OpenAIFunctionsAgent
8
  from langchain.callbacks.base import BaseCallbackHandler
9
- from langchain.chains import LLMChain, RetrievalQA
10
  from langchain.chat_models import (
11
  AzureChatOpenAI,
12
  ChatAnthropic,
@@ -14,7 +14,7 @@ from langchain.chat_models import (
14
  ChatOpenAI,
15
  )
16
  from langchain.document_loaders import PyPDFLoader
17
- from langchain.embeddings import AzureOpenAIEmbeddings, OpenAIEmbeddings
18
  from langchain.llms.base import BaseLLM
19
  from langchain.memory import ConversationBufferMemory
20
  from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
@@ -132,31 +132,38 @@ def get_runnable(
132
  chat_prompt,
133
  summarization_prompt,
134
  ):
135
- if not use_document_chat:
136
- return LLMChain(
137
- prompt=chat_prompt,
138
- llm=llm,
139
- memory=memory,
140
- ) | (lambda output: output["text"])
141
 
142
- # if document_chat_chain_type == "Q&A Generation":
143
- # return get_rag_qa_gen_chain(
144
- # retriever,
145
- # llm,
146
- # )
147
- # elif document_chat_chain_type == "Summarization":
148
- # return get_rag_summarization_chain(
149
- # summarization_prompt,
150
- # retriever,
151
- # llm,
152
- # )
153
- else:
154
- return RetrievalQA.from_chain_type(
155
- llm=llm,
156
- chain_type=document_chat_chain_type,
157
- retriever=retriever,
158
- output_key="output_text",
159
- ) | (lambda output: output["output_text"])
 
 
 
 
 
 
 
160
 
161
 
162
  def get_llm(
@@ -246,12 +253,12 @@ def get_texts_and_multiretriever(
246
  sub_texts.extend(_sub_texts)
247
 
248
  embeddings_kwargs = {"openai_api_key": openai_api_key}
249
- if use_azure and azure_kwargs:
250
- azure_kwargs["azure_endpoint"] = azure_kwargs.pop("openai_api_base")
251
- embeddings_kwargs.update(azure_kwargs)
252
- embeddings = AzureOpenAIEmbeddings(**embeddings_kwargs)
253
- else:
254
- embeddings = OpenAIEmbeddings(**embeddings_kwargs)
255
  store = InMemoryStore()
256
 
257
  # MultiVectorRetriever
 
6
  from langchain.agents import AgentExecutor, AgentType, initialize_agent
7
  from langchain.agents.openai_functions_agent.base import OpenAIFunctionsAgent
8
  from langchain.callbacks.base import BaseCallbackHandler
9
+ from langchain.chains import RetrievalQA
10
  from langchain.chat_models import (
11
  AzureChatOpenAI,
12
  ChatAnthropic,
 
14
  ChatOpenAI,
15
  )
16
  from langchain.document_loaders import PyPDFLoader
17
+ from langchain.embeddings import OpenAIEmbeddings
18
  from langchain.llms.base import BaseLLM
19
  from langchain.memory import ConversationBufferMemory
20
  from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
 
132
  chat_prompt,
133
  summarization_prompt,
134
  ):
135
+ # if not use_document_chat:
136
+ # return LLMChain(
137
+ # prompt=chat_prompt,
138
+ # llm=llm,
139
+ # memory=memory,
140
+ # ) | (lambda output: output["text"])
141
 
142
+ # # if document_chat_chain_type == "Q&A Generation":
143
+ # # return get_rag_qa_gen_chain(
144
+ # # retriever,
145
+ # # llm,
146
+ # # )
147
+ # # elif document_chat_chain_type == "Summarization":
148
+ # # return get_rag_summarization_chain(
149
+ # # summarization_prompt,
150
+ # # retriever,
151
+ # # llm,
152
+ # # )
153
+ # else:
154
+ return RetrievalQA.from_chain_type(
155
+ llm=llm,
156
+ chain_type=document_chat_chain_type,
157
+ retriever=retriever,
158
+ output_key="output_text",
159
+ return_source_documents=True,
160
+ ) | (
161
+ lambda output: output["output_text"]
162
+ + "\n\n"
163
+ + "Source Documents:"
164
+ + "\n"
165
+ + "\n".join([x for x in output["source_documents"].page_content])
166
+ )
167
 
168
 
169
  def get_llm(
 
253
  sub_texts.extend(_sub_texts)
254
 
255
  embeddings_kwargs = {"openai_api_key": openai_api_key}
256
+ # if use_azure and azure_kwargs:
257
+ # azure_kwargs["azure_endpoint"] = azure_kwargs.pop("openai_api_base")
258
+ # embeddings_kwargs.update(azure_kwargs)
259
+ # embeddings = AzureOpenAIEmbeddings(**embeddings_kwargs)
260
+ # else:
261
+ embeddings = OpenAIEmbeddings(**embeddings_kwargs)
262
  store = InMemoryStore()
263
 
264
  # MultiVectorRetriever