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 =
|
202 |
-
|
203 |
-
|
204 |
-
|
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 |
-
|
453 |
-
|
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 |
-
|
504 |
-
|
505 |
-
|
506 |
-
|
507 |
-
|
508 |
-
|
509 |
-
|
510 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
511 |
)
|
512 |
|
513 |
-
|
514 |
-
|
515 |
-
|
516 |
-
return st.session_state.doc_chain.invoke(
|
517 |
-
input_str,
|
518 |
-
config=get_config(callbacks),
|
519 |
-
)
|
520 |
|
521 |
-
|
522 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
523 |
)
|
524 |
|
525 |
-
|
526 |
-
|
527 |
-
|
528 |
-
|
529 |
-
|
530 |
-
|
531 |
-
|
532 |
-
|
533 |
-
|
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
|
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.
|
40 |
|
41 |
MIN_MAX_TOKENS = int(os.environ.get("MIN_MAX_TOKENS", 1))
|
42 |
-
MAX_MAX_TOKENS = int(os.environ.get("MAX_MAX_TOKENS",
|
43 |
-
DEFAULT_MAX_TOKENS = int(os.environ.get("DEFAULT_MAX_TOKENS",
|
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
|
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
|
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 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
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 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
251 |
-
|
252 |
-
|
253 |
-
else:
|
254 |
-
|
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
|