reab5555's picture
Update processing.py
3524dd9 verified
raw
history blame
4.67 kB
from langchain.schema import HumanMessage
from output_parser import output_parser
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from llm_loader import load_model
from config import openai_api_key
from langchain.chains import RetrievalQA
import os
import json
embedding_model = OpenAIEmbeddings(openai_api_key=openai_api_key)
knowledge_files = {
"attachments": "knowledge/bartholomew_attachments_definitions.txt",
"bigfive": "knowledge/bigfive_definitions.txt",
"personalities": "knowledge/personalities_definitions.txt"
}
documents = []
for key, file_path in knowledge_files.items():
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read().strip()
documents.append(content)
faiss_index = FAISS.from_texts(documents, embedding_model)
llm = load_model(openai_api_key)
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=faiss_index.as_retriever())
def load_text(file_path: str) -> str:
with open(file_path, 'r', encoding='utf-8') as file:
return file.read().strip()
def truncate_text(text: str, max_tokens: int = 10000) -> str:
words = text.split()
if len(words) > max_tokens:
return ' '.join(words[:max_tokens])
return text
def process_input(input_text: str, llm):
general_task = load_text("tasks/general_task.txt")
attachments_task = load_text("tasks/Attachments_task.txt")
bigfive_task = load_text("tasks/BigFive_task.txt")
personalities_task = load_text("tasks/Personalities_task.txt")
truncated_input = truncate_text(input_text)
relevant_docs = qa_chain.invoke({"query": truncated_input})
if isinstance(relevant_docs, dict) and 'result' in relevant_docs:
retrieved_knowledge = relevant_docs['result']
else:
retrieved_knowledge = str(relevant_docs)
prompt = f"""{general_task}
Attachment Styles Task:
{attachments_task}
Big Five Traits Task:
{bigfive_task}
Personality Disorders Task:
{personalities_task}
Retrieved Knowledge: {retrieved_knowledge}
Input: {truncated_input}
Please provide a comprehensive analysis for each speaker, including:
1. General Impression
2. Attachment styles (use the format from the Attachment Styles Task)
3. Big Five traits (use the format from the Big Five Traits Task)
4. Personality disorders (use the format from the Personality Disorders Task)
Respond with a JSON object containing an array of speaker analyses under the key 'speaker_analyses'. Each speaker analysis should include all four aspects mentioned above.
Analysis:"""
messages = [HumanMessage(content=prompt)]
response = llm.invoke(messages)
print("Raw LLM Model Output:")
print(response.content)
try:
content = response.content
if content.startswith("```json"):
content = content.split("```json", 1)[1]
if content.endswith("```"):
content = content.rsplit("```", 1)[0]
parsed_json = json.loads(content.strip())
results = {}
speaker_analyses = parsed_json.get('speaker_analyses', [])
for i, speaker_analysis in enumerate(speaker_analyses, 1):
speaker_id = f"Speaker {i}"
results[speaker_id] = {
'general_impression': speaker_analysis.get('GeneralImpression', 'No general impression provided'),
'attachments': output_parser.parse_speaker_analysis(speaker_analysis).AttachmentStyle,
'bigfive': output_parser.parse_speaker_analysis(speaker_analysis).BigFiveTraits,
'personalities': output_parser.parse_speaker_analysis(speaker_analysis).PersonalityDisorder
}
if not results:
print("Warning: No speaker analyses found in the parsed JSON.")
return {"Speaker 1": {
'general_impression': 'No general impression provided',
'attachments': output_parser.parse_speaker_analysis({}).AttachmentStyle,
'bigfive': output_parser.parse_speaker_analysis({}).BigFiveTraits,
'personalities': output_parser.parse_speaker_analysis({}).PersonalityDisorder
}}
return results
except Exception as e:
print(f"Error processing input: {e}")
return {"Speaker 1": {
'general_impression': 'No general impression provided',
'attachments': output_parser.parse_speaker_analysis({}).AttachmentStyle,
'bigfive': output_parser.parse_speaker_analysis({}).BigFiveTraits,
'personalities': output_parser.parse_speaker_analysis({}).PersonalityDisorder
}}