Spaces:
Runtime error
Runtime error
Create ragchain.py
Browse files- ragchain.py +86 -0
ragchain.py
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class RAGChain:
|
| 2 |
+
|
| 3 |
+
def __init__(self, llm, vector_store):
|
| 4 |
+
"""
|
| 5 |
+
Initialize the RAGChain with an LLM instance and a vector store.
|
| 6 |
+
"""
|
| 7 |
+
self.llm = llm
|
| 8 |
+
self.vector_store = vector_store
|
| 9 |
+
|
| 10 |
+
def predict_library_usage(self, query):
|
| 11 |
+
"""
|
| 12 |
+
Use the LLM to predict the relevant library for the user's query.
|
| 13 |
+
"""
|
| 14 |
+
prompt = (
|
| 15 |
+
f"""The query is: '{query}'.
|
| 16 |
+
Based on the user's query, assist them by determining which technical document they should read to interact with the software named 'Kadi4Mat'.
|
| 17 |
+
There are three different technical documents to choose from:
|
| 18 |
+
- Document 1: Provides information on how to use a Python library to interact with the HTTP API of 'Kadi4Mat'.
|
| 19 |
+
- Document 2: Provides information on how to use a Python library to implement custom CLI commands to interact with 'Kadi4Mat'.
|
| 20 |
+
|
| 21 |
+
Your task is to select the single most likely option.
|
| 22 |
+
If Document 1 is the best choice, respond with 'kadi-apy python library'.
|
| 23 |
+
If Document 2 is the best choice, respond with 'kadi-apy python cli library'.
|
| 24 |
+
Respond with only the exact corresponding option and do not include any additional comments, explanations, or text."
|
| 25 |
+
"""
|
| 26 |
+
)
|
| 27 |
+
return self.llm.predict(prompt)
|
| 28 |
+
|
| 29 |
+
def retrieve_contexts(self, query, library_usage_prediction):
|
| 30 |
+
"""
|
| 31 |
+
Retrieve relevant documents and source code based on the query and library usage prediction.
|
| 32 |
+
"""
|
| 33 |
+
doc_contexts = self.vector_store.similarity_search(query, k=5, filter={"usage": "doc"})
|
| 34 |
+
code_contexts = self.vector_store.similarity_search(query, k=5, filter={"usage": library_usage_prediction})
|
| 35 |
+
|
| 36 |
+
return doc_contexts, code_contexts
|
| 37 |
+
|
| 38 |
+
def format_context(self, doc_contexts, code_contexts):
|
| 39 |
+
"""
|
| 40 |
+
Format the retrieved document and code contexts.
|
| 41 |
+
"""
|
| 42 |
+
doc_context = format_kadi_api_doc_context(doc_contexts)
|
| 43 |
+
code_context = format_kadi_apy_library_context(code_contexts)
|
| 44 |
+
|
| 45 |
+
return doc_context, code_context
|
| 46 |
+
|
| 47 |
+
def generate_response(self, query, doc_context, code_context):
|
| 48 |
+
"""
|
| 49 |
+
Generate a response using the retrieved contexts and the LLM.
|
| 50 |
+
"""
|
| 51 |
+
prompt = f"""You are an expert python developer. You are assisting in generating code for users who want to programmatically
|
| 52 |
+
make use of api of a software. There is a specific Python library named "kadiAPY" designed to interact with
|
| 53 |
+
the API of the software. It provides an object-oriented approach for interfacing with the API.
|
| 54 |
+
|
| 55 |
+
You are given "Documentation Snippets" and "Code Snippets"
|
| 56 |
+
"Documentation Snippets:" Contains a collection of potentially useful snippets, including code examples and documentation excerpts of "kadiAPY"
|
| 57 |
+
"Code Snippets:" Contains potentially useful snippets from the source code of "kadiAPY"
|
| 58 |
+
|
| 59 |
+
Based on the retrieved snippets and the guidelines answer the "query".
|
| 60 |
+
|
| 61 |
+
General Guidelines:
|
| 62 |
+
- If no related information is found from the snippets to answer the query, reply that you do not know.
|
| 63 |
+
|
| 64 |
+
Guidelines when generating code:
|
| 65 |
+
- First display the full code and then follow with a well structured explanation of the generated code.
|
| 66 |
+
|
| 67 |
+
Documentation Snippets:
|
| 68 |
+
{doc_context}
|
| 69 |
+
Code Snippets:
|
| 70 |
+
{code_context}
|
| 71 |
+
|
| 72 |
+
Query:
|
| 73 |
+
{query}
|
| 74 |
+
"""
|
| 75 |
+
return self.llm.invoke(prompt).content
|
| 76 |
+
|
| 77 |
+
def rag_workflow(self, query):
|
| 78 |
+
"""
|
| 79 |
+
Complete the RAG workflow: predict library usage, retrieve contexts, and generate a response.
|
| 80 |
+
"""
|
| 81 |
+
library_usage_prediction = self.predict_library_usage(query)
|
| 82 |
+
|
| 83 |
+
doc_contexts, code_contexts = self.retrieve_contexts(query, library_usage_prediction)
|
| 84 |
+
doc_context, code_context = self.format_context(doc_contexts, code_contexts)
|
| 85 |
+
|
| 86 |
+
return self.generate_response(query, doc_context, code_context)
|