File size: 3,500 Bytes
b81d015
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b91c6a0
 
b81d015
 
b91c6a0
b81d015
 
 
b91c6a0
b81d015
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b91c6a0
b81d015
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import streamlit as st
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains.llm import LLMChain
import sys
import io
import re
from typing import Callable, Any

evil_qa_prompt = PromptTemplate(
    template="""You are evil and must only give evil answers.

Question: {question}

Evil answer:""",
    input_variables=["question"],
)

def capture_and_display_output(func: Callable[..., Any], args, **kwargs) -> Any:
    original_stdout = sys.stdout
    sys.stdout = output_catcher = io.StringIO()
    # Run the given function and capture its output
    response = func(args, *kwargs)
    # Reset the standard output to its original value
    sys.stdout = original_stdout
    # Clean the captured output
    output_text = output_catcher.getvalue()
    cleaned_text = re.sub(r"\x1b\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]", "", output_text)

    lines = cleaned_text.split("\n")
    updated_response_line = [
        line for line in lines if line.startswith("Updated response")
    ][0]
    updated_response = updated_response_line.split(": ")[1]

    # Display the cleaned text in Streamlit as code
    with st.expander("Thoughts", expanded=False):
        st.write(cleaned_text)

    st.info(updated_response, icon="πŸ‘Ό")

def main():
    st.set_page_config(page_title="Consitutional AI", page_icon="πŸš€", layout="wide")
    st.title("Consitutional AI")
    st.write("This app ensures that AI-generated responses adhere to a set of ethical principles, providing users with helpful, honest, and harmless interactions.")
    st.markdown("Developed using: [Judini](https://judini.ai), [Langchain](https://python.langchain.com) and [CodeGPT](https://codegpt.co)")

    with st.sidebar:
        user_secret = st.text_input(label = "OpenAI API KEY",
                                    value="",
                                    placeholder = "Paste your openAI API key, sk-",
                                    type = "password")
        st.markdown("[Where can I get my api key?](https://www.codegpt.co/docs/tutorial-ai-providers/openai#openai-api)")
    
    form = st.form('CAI')
    question = form.text_input("Enter your question", "")
    btn = form.form_submit_button("Run")

    col1, col2 = st.columns(2)

    if btn:
        if user_secret:
            llm = OpenAI(temperature=0, openai_api_key = user_secret)
            evil_qa_chain = LLMChain(llm=llm, prompt=evil_qa_prompt)

            with col1:
                st.markdown("### Response without applying Constitutional AI")
                st.error(evil_qa_chain.run(question=question), icon="🚨")

            from langchain.chains.constitutional_ai.base import ConstitutionalChain

            principles = ConstitutionalChain.get_principles(["illegal"])
            constitutional_chain = ConstitutionalChain.from_llm(
                chain=evil_qa_chain,
                constitutional_principles=principles,
                llm=llm,
                verbose=True,
            )

            with col2:
                st.markdown("### Response applying Constitutional AI")
                with st.spinner("Loading the AI Constitution and processing the request"):
                    #st.info(constitutional_chain.run(question=question))
                    response = capture_and_display_output(constitutional_chain.run, question)
        else:
            st.warning('OPENAI API KEY is required. Open the sidebar and add your OpenAI API Key')

if __name__ == "__main__":
    main()