This is an automated email from the ASF dual-hosted git repository.

jin pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-hugegraph-ai.git


The following commit(s) were added to refs/heads/main by this push:
     new 6e25d23  refactor(llm): add doc & disable text2gql by default (#216)
6e25d23 is described below

commit 6e25d231b918e1b27e5851ad9efa70b3ee7e37b5
Author: SoJGooo <102796027+mrjs...@users.noreply.github.com>
AuthorDate: Wed May 7 15:40:48 2025 +0800

    refactor(llm): add doc & disable text2gql by default (#216)
    
    Co-authored-by: imbajin <j...@apache.org>
---
 hugegraph-llm/quick_start.md                       |  1 +
 hugegraph-llm/src/hugegraph_llm/api/admin_api.py   |  4 +++-
 .../src/hugegraph_llm/config/prompt_config.py      | 22 ++++++++++++++--------
 .../hugegraph_llm/demo/rag_demo/configs_block.py   |  2 +-
 .../src/hugegraph_llm/demo/rag_demo/rag_block.py   |  6 +++---
 .../src/hugegraph_llm/operators/graph_rag_task.py  |  2 +-
 .../operators/hugegraph_op/graph_rag_query.py      |  5 +++--
 7 files changed, 26 insertions(+), 16 deletions(-)

diff --git a/hugegraph-llm/quick_start.md b/hugegraph-llm/quick_start.md
index 4dd340c..dbbfe92 100644
--- a/hugegraph-llm/quick_start.md
+++ b/hugegraph-llm/quick_start.md
@@ -103,6 +103,7 @@ graph TD;
 - **Question:** Input the query
 - **Query** **Prompt:** The prompt template used to ask the final question to 
the LLM
 - **Keywords Extraction Prompt:** The prompt template for extracting keywords 
from the question
+- **Template Num:** < 0 means disable text2gql; = 0 means no 
template(zero-shot); > 0 means using the specified number of templates
 
 ### Query Scope Selection:
 
diff --git a/hugegraph-llm/src/hugegraph_llm/api/admin_api.py 
b/hugegraph-llm/src/hugegraph_llm/api/admin_api.py
index a234c50..05648d4 100644
--- a/hugegraph-llm/src/hugegraph_llm/api/admin_api.py
+++ b/hugegraph-llm/src/hugegraph_llm/api/admin_api.py
@@ -14,6 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
+
 import os
 
 from fastapi import status, APIRouter
@@ -30,7 +31,8 @@ def admin_http_api(router: APIRouter, log_stream):
     @router.post("/logs", status_code=status.HTTP_200_OK)
     async def log_stream_api(req: LogStreamRequest):
         if admin_settings.admin_token != req.admin_token:
-            raise 
generate_response(RAGResponse(status_code=status.HTTP_403_FORBIDDEN, 
message="Invalid admin_token")) #pylint: disable=E0702
+            raise 
generate_response(RAGResponse(status_code=status.HTTP_403_FORBIDDEN, #pylint: 
disable=E0702
+                                                message="Invalid admin_token"))
         log_path = os.path.join("logs", req.log_file)
 
         # Create a StreamingResponse that reads from the log stream generator
diff --git a/hugegraph-llm/src/hugegraph_llm/config/prompt_config.py 
b/hugegraph-llm/src/hugegraph_llm/config/prompt_config.py
index ca2b7b7..919c906 100644
--- a/hugegraph-llm/src/hugegraph_llm/config/prompt_config.py
+++ b/hugegraph-llm/src/hugegraph_llm/config/prompt_config.py
@@ -26,7 +26,7 @@ class PromptConfig(BasePromptConfig):
 
 Please provide precise and accurate answers based on the following context 
information, which is sorted in order of importance from high to low, without 
using any fabricated knowledge.
 
-Given the context information and without using fictive knowledge, 
+Given the context information and without using fictive knowledge,
 answer the following query in a concise and professional manner.
 Please write your answer using Markdown with MathJax syntax, where inline math 
is wrapped with `$...$`
 
@@ -53,7 +53,7 @@ Graph Schema:
 - "edges": [List of edge labels, their source and target vertex labels, and 
properties]
 
 ### Content Rule:
-Please read the provided text carefully and identify any information that 
corresponds to the vertices and edges defined in the schema. 
+Please read the provided text carefully and identify any information that 
corresponds to the vertices and edges defined in the schema.
 You are not allowed to modify the schema contraints. Your task is to format 
the provided information into the required schema, without missing any keyword.
 For each piece of information that matches a vertex or edge, format it 
strictly according to the following JSON structures:
 
@@ -82,7 +82,7 @@ where:
     - "sourceVertexId": "vertexLabelID:entityName"
     - "targetVertexId": "vertexLabelID:entityName"
 
-Strictly follow these rules: 
+Strictly follow these rules:
 1. Don't extract property fields or labels that doesn't exist in the given 
schema. Do not generate new information.
 2. Ensure the extracted property set in the same type as the given schema 
(like 'age' should be a number, 'select' should be a boolean).
 3. If there are multiple primary keys, the strategy for generating VID is: 
vertexlabelID:pk1!pk2!pk3 (pk means primary key, and '!' is the separator). 
This id must be generated ONLY if there are multiple primary keys. If there is 
only one primary key, the strategy for generating VID is: int (sequencially 
increasing).
@@ -93,7 +93,7 @@ Refer to the following baseline example to understand the 
output generation requ
 ## Example:
 ### Input example:
 #### text:
-Meet Sarah, a 30-year-old attorney, and her roommate, James, whom she's shared 
a home with since 2010. James, in his professional life, works as a journalist. 
 
+Meet Sarah, a 30-year-old attorney, and her roommate, James, whom she's shared 
a home with since 2010. James, in his professional life, works as a journalist.
 
 #### graph schema example:
 
{"vertices":[{"vertex_label":"person","properties":["name","age","occupation"]}],
 "edges":[{"edge_label":"roommate", 
"source_vertex_label":"person","target_vertex_label":"person","properties":["date"]]}
@@ -165,22 +165,22 @@ Meet Sarah, a 30-year-old attorney, and her roommate, 
James, whom she's shared a
        - For these keywords that need rewriting, generate synonyms or similar 
terms in the given context.
        - Replace the corresponding keywords in the original text with 
generated synonyms.
        - If no suitable synonym exists for a keyword, keep the original 
keyword unchanged.
-    
+
     Requirements:
     - Keywords should be meaningful and specific entities; avoid meaningless 
or overly broad terms, or single-character words (e.g., "items", "actions", 
"effects", "functions", "the", "he").
     - Prioritize extracting subjects, verbs, and objects; avoid function words 
or auxiliary words.
     - Maintain semantic integrity: Extracted keywords should preserve their 
semantic and informational completeness in the original context (e.g., "Apple 
computer" should be extracted as a whole, not split into "Apple" and 
"computer").
     - Avoid generalization: Do not expand into unrelated generalized 
categories.
-    
+
     Notes:
     - Only consider context-relevant synonyms: Only consider semantic synonyms 
and words with similar meanings in the given context.
     - Adjust keyword length: If keywords are relatively broad, you can 
appropriately increase individual keyword length based on context (e.g., 
"illegal behavior" can be extracted as a single keyword, or as "illegal", but 
should not be split into "illegal" and "behavior").
-    
+
     Output Format:
     - Output only one line, prefixed with KEYWORDS:, followed by all keywords 
or corresponding synonyms, separated by commas. No spaces or empty characters 
are allowed in the extracted keywords.
     - Format example:
     KEYWORDS:keyword1,keyword2,...,keywordN
-    
+
     MAX_KEYWORDS: {max_keywords}
     Text:
     {question}
@@ -233,6 +233,9 @@ Referenced Extracted Vertex IDs Related to the Query:
 
 Generate Gremlin from the Following User Query:
 {query}
+
+**Important: Do NOT output any analysis, reasoning steps, explanations or any 
other text. ONLY return the Gremlin query wrapped in a code block with 
```gremlin``` fences.**
+
 The generated Gremlin is:
 """
 
@@ -345,6 +348,9 @@ g.V().limit(10)
 
 从以下用户查询生成Gremlin:
 {query}
+
+**重要提示:请勿输出任何分析、推理步骤、解释或其他文本。仅返回用 ```gremlin``` 标记包装的 Gremlin 查询。**
+
 生成的Gremlin是:
 """
 
diff --git a/hugegraph-llm/src/hugegraph_llm/demo/rag_demo/configs_block.py 
b/hugegraph-llm/src/hugegraph_llm/demo/rag_demo/configs_block.py
index 74527d1..73d0600 100644
--- a/hugegraph-llm/src/hugegraph_llm/demo/rag_demo/configs_block.py
+++ b/hugegraph-llm/src/hugegraph_llm/demo/rag_demo/configs_block.py
@@ -213,7 +213,7 @@ def apply_llm_config(current_llm_config, arg1, arg2, arg3, 
arg4, origin_call=Non
         test_url = getattr(llm_settings, 
f"openai_{current_llm_config}_api_base") + "/chat/completions"
         data = {
             "model": arg3,
-            "temperature": 0.0,
+            "temperature": 0.01,
             "messages": [{"role": "user", "content": "test"}],
         }
         headers = {"Authorization": f"Bearer {arg1}"}
diff --git a/hugegraph-llm/src/hugegraph_llm/demo/rag_demo/rag_block.py 
b/hugegraph-llm/src/hugegraph_llm/demo/rag_demo/rag_block.py
index baf7ef9..cc6bb44 100644
--- a/hugegraph-llm/src/hugegraph_llm/demo/rag_demo/rag_block.py
+++ b/hugegraph-llm/src/hugegraph_llm/demo/rag_demo/rag_block.py
@@ -42,7 +42,7 @@ def rag_answer(
     custom_related_information: str,
     answer_prompt: str,
     keywords_extract_prompt: str,
-    gremlin_tmpl_num: Optional[int] = 2,
+    gremlin_tmpl_num: Optional[int] = -1,
     gremlin_prompt: Optional[str] = None,
     max_graph_items=30,
     topk_return_results=20,
@@ -157,7 +157,7 @@ async def rag_answer_streaming(
     custom_related_information: str,
     answer_prompt: str,
     keywords_extract_prompt: str,
-    gremlin_tmpl_num: Optional[int] = 2,
+    gremlin_tmpl_num: Optional[int] = -1,
     gremlin_prompt: Optional[str] = None,
 ) -> AsyncGenerator[Tuple[str, str, str, str], None]:
     """
@@ -291,7 +291,7 @@ def create_rag_block():
                         value="reranker" if online_rerank else "bleu",
                         label="Rerank method",
                     )
-                    example_num = gr.Number(value=2, label="Template Num (0 to 
disable it) ", precision=0)
+                    example_num = gr.Number(value=-1, label="Template Num (<0 
means disable text2gql) ", precision=0)
                     graph_ratio = gr.Slider(0, 1, 0.6, label="Graph Ratio", 
step=0.1, interactive=False)
 
                 graph_vector_radio.change(
diff --git a/hugegraph-llm/src/hugegraph_llm/operators/graph_rag_task.py 
b/hugegraph-llm/src/hugegraph_llm/operators/graph_rag_task.py
index 9c3dcf9..9f3d64d 100644
--- a/hugegraph-llm/src/hugegraph_llm/operators/graph_rag_task.py
+++ b/hugegraph-llm/src/hugegraph_llm/operators/graph_rag_task.py
@@ -128,7 +128,7 @@ class RAGPipeline:
         max_v_prop_len: int = 2048,
         max_e_prop_len: int = 256,
         prop_to_match: Optional[str] = None,
-        num_gremlin_generate_example: Optional[int] = 1,
+        num_gremlin_generate_example: Optional[int] = -1,
         gremlin_prompt: Optional[str] = prompt.gremlin_generate_prompt,
     ):
         """
diff --git 
a/hugegraph-llm/src/hugegraph_llm/operators/hugegraph_op/graph_rag_query.py 
b/hugegraph-llm/src/hugegraph_llm/operators/hugegraph_op/graph_rag_query.py
index 53aff68..4b94c07 100644
--- a/hugegraph-llm/src/hugegraph_llm/operators/hugegraph_op/graph_rag_query.py
+++ b/hugegraph-llm/src/hugegraph_llm/operators/hugegraph_op/graph_rag_query.py
@@ -84,7 +84,7 @@ class GraphRAGQuery:
         embedding: Optional[BaseEmbedding] = None,
         max_v_prop_len: Optional[int] = 2048,
         max_e_prop_len: Optional[int] = 256,
-        num_gremlin_generate_example: Optional[int] = 1,
+        num_gremlin_generate_example: Optional[int] = -1,
         gremlin_prompt: Optional[str] = None,
     ):
         self._client = PyHugeClient(
@@ -115,7 +115,8 @@ class GraphRAGQuery:
         # initial flag: -1 means no result, 0 means subgraph query, 1 means 
gremlin query
         context["graph_result_flag"] = -1
         # 1. Try to perform a query based on the generated gremlin
-        context = self._gremlin_generate_query(context)
+        if self._num_gremlin_generate_example >= 0:
+            context = self._gremlin_generate_query(context)
         # 2. Try to perform a query based on subgraph-search if the previous 
query failed
         if not context.get("graph_result"):
             context = self._subgraph_query(context)

Reply via email to