Select Page

GraphRAG 使用本地端的 Ollama

GraphRAG圖像檢索增強生成(Graph Retrieval-Augmented Generation,GraphRAG)超好用,但也超級貴,超級花錢,想要省錢的話,就要用本地端的服務如(Ollama),要用的話,可以按照下面的步驟處理,前提是你已經可以使用 OpenAI 版本的 GraphRAG 了,本篇是要把 OpenAI 改成 Ollama

講在前面

要先設定好 GraphRAG

下載以及安裝好 Ollama

安裝 ollama 的 Python 套件

pip install ollama

修改原先的 setting.yaml 檔案

把舊的 yaml 檔案改成 ollama 的設定檔,新的設定檔案如下

encoding_model: cl100k_base
skip_workflows: []
llm:
  api_key: ${GRAPHRAG_API_KEY}
  type: openai_chat # or azure_openai_chat
  # model: gpt-4o-mini
  model_supports_json: true # recommended if this is available for your model.
  # max_tokens: 4000
  # request_timeout: 180.0
  # api_base: https://<instance>.openai.azure.com
  # api_version: 2024-02-15-preview
  # organization: <organization_id>
  # deployment_name: <azure_model_deployment_name>
  # tokens_per_minute: 150_000 # set a leaky bucket throttle
  # requests_per_minute: 10_000 # set a leaky bucket throttle
  # max_retries: 10
  # max_retry_wait: 10.0
  # sleep_on_rate_limit_recommendation: true # whether to sleep when azure suggests wait-times
  # concurrent_requests: 25 # the number of parallel inflight requests that may be made

  # ollama api_base
  api_base: http://localhost:11434/v1
  model: llama3

parallelization:
  stagger: 0.3
  # num_threads: 50 # the number of threads to use for parallel processing

async_mode: threaded # or asyncio

embeddings:
  ## parallelization: override the global parallelization settings for embeddings
  async_mode: threaded # or asyncio
  llm:
    api_key: ${GRAPHRAG_API_KEY}
    type: openai_embedding # or azure_openai_embedding
    # model: text-embedding-3-small
    
    # ollama
    model: nomic-embed-text 
    api_base: http://localhost:11434/api

    # api_base: https://<instance>.openai.azure.com
    # api_version: 2024-02-15-preview
    # organization: <organization_id>
    # deployment_name: <azure_model_deployment_name>
    # tokens_per_minute: 150_000 # set a leaky bucket throttle
    # requests_per_minute: 10_000 # set a leaky bucket throttle
    # max_retries: 10
    # max_retry_wait: 10.0
    # sleep_on_rate_limit_recommendation: true # whether to sleep when azure suggests wait-times
    # concurrent_requests: 25 # the number of parallel inflight requests that may be made
    # batch_size: 16 # the number of documents to send in a single request
    # batch_max_tokens: 8191 # the maximum number of tokens to send in a single request
    # target: required # or optional
  
chunks:
  size: 300
  overlap: 100
  group_by_columns: [id] # by default, we don't allow chunks to cross documents
    
input:
  type: file # or blob
  file_type: text # or csv
  base_dir: "input"
  file_encoding: utf-8
  file_pattern: ".*\\.txt$"

cache:
  type: file # or blob
  base_dir: "cache"
  # connection_string: <azure_blob_storage_connection_string>
  # container_name: <azure_blob_storage_container_name>

storage:
  type: file # or blob
  base_dir: "output/${timestamp}/artifacts"
  # connection_string: <azure_blob_storage_connection_string>
  # container_name: <azure_blob_storage_container_name>

reporting:
  type: file # or console, blob
  base_dir: "output/${timestamp}/reports"
  # connection_string: <azure_blob_storage_connection_string>
  # container_name: <azure_blob_storage_container_name>

entity_extraction:
  ## llm: override the global llm settings for this task
  ## parallelization: override the global parallelization settings for this task
  ## async_mode: override the global async_mode settings for this task
  prompt: "prompts/entity_extraction.txt"
  entity_types: [organization,person,geo,event]
  max_gleanings: 0

summarize_descriptions:
  ## llm: override the global llm settings for this task
  ## parallelization: override the global parallelization settings for this task
  ## async_mode: override the global async_mode settings for this task
  prompt: "prompts/summarize_descriptions.txt"
  max_length: 500

claim_extraction:
  ## llm: override the global llm settings for this task
  ## parallelization: override the global parallelization settings for this task
  ## async_mode: override the global async_mode settings for this task
  # enabled: true
  prompt: "prompts/claim_extraction.txt"
  description: "Any claims or facts that could be relevant to information discovery."
  max_gleanings: 0

community_report:
  ## llm: override the global llm settings for this task
  ## parallelization: override the global parallelization settings for this task
  ## async_mode: override the global async_mode settings for this task
  prompt: "prompts/community_report.txt"
  max_length: 2000
  max_input_length: 8000

cluster_graph:
  max_cluster_size: 10

embed_graph:
  enabled: true # if true, will generate node2vec embeddings for nodes
  # num_walks: 10
  # walk_length: 40
  # window_size: 2
  # iterations: 3
  # random_seed: 597832

umap:
  enabled: true # if true, will generate UMAP embeddings for nodes

snapshots:
  graphml: true
  raw_entities: true
  top_level_nodes: true

local_search:
  # text_unit_prop: 0.5
  # community_prop: 0.1
  # conversation_history_max_turns: 5
  # top_k_mapped_entities: 10
  # top_k_relationships: 10
  # max_tokens: 12000

global_search:
  # max_tokens: 12000
  # data_max_tokens: 12000
  # map_max_tokens: 1000
  # reduce_max_tokens: 2000
  # concurrency: 32

其中修改 llm 區塊

修改 model: llama3

加入 api_base: http://localhost:11434/v1

修改 embeddings 區塊

model: nomic-embed-text

api_base: http://localhost:11434/api

修改 GraphRAG 的程式碼

除了設定好 setting.yaml 以外,程式碼也要修改成可以支持 ollama 的程式碼,有兩處要改,可以用以下現成的程式碼

  1. C:\Users\xxx\anaconda3\envs\GraphRAG\Lib\site-packages\graphrag\llm\openai\openai_embeddings_llm.py

加入 ollama setting 區塊

# Copyright (c) 2024 Microsoft Corporation.
# Licensed under the MIT License

"""The EmbeddingsLLM class."""

from typing_extensions import Unpack

from graphrag.llm.base import BaseLLM
from graphrag.llm.types import (
    EmbeddingInput,
    EmbeddingOutput,
    LLMInput,
)
import ollama

from .openai_configuration import OpenAIConfiguration
from .types import OpenAIClientTypes


class OpenAIEmbeddingsLLM(BaseLLM[EmbeddingInput, EmbeddingOutput]):
    """A text-embedding generator LLM."""

    _client: OpenAIClientTypes
    _configuration: OpenAIConfiguration

    def __init__(self, client: OpenAIClientTypes, configuration: OpenAIConfiguration):
        self.client = client
        self.configuration = configuration

    async def _execute_llm(
        self, input: EmbeddingInput, **kwargs: Unpack[LLMInput]
    ) -> EmbeddingOutput | None:
        args = {
            "model": self.configuration.model,
            **(kwargs.get("model_parameters") or {}),
        }
        # openai setting
        # embedding = await self.client.embeddings.create(
        #    input=input,
        #    **args,
        #)
        #return [d.embedding for d in embedding.data]

        # ollama setting
        embedding_list=[]
        for inp in input:
            embedding = ollama.embeddings(model='qwen:7b', prompt=inp) #如果要改模型, 模型的名字要換掉
            embedding_list.append(embedding['embedding'])
        return embedding_list        
  1. C:\Users\xxx\anaconda3\envs\GraphRAG\Lib\site-packages\graphrag\query\llm\oai\embedding.py

加入 ollama setting 區塊,並且關閉 openai setting 區塊即可

# Copyright (c) 2024 Microsoft Corporation.
# Licensed under the MIT License

"""OpenAI Embedding model implementation."""

import asyncio
from collections.abc import Callable
from typing import Any

import numpy as np
import tiktoken
from tenacity import (
    AsyncRetrying,
    RetryError,
    Retrying,
    retry_if_exception_type,
    stop_after_attempt,
    wait_exponential_jitter,
)

from graphrag.query.llm.base import BaseTextEmbedding
from graphrag.query.llm.oai.base import OpenAILLMImpl
from graphrag.query.llm.oai.typing import (
    OPENAI_RETRY_ERROR_TYPES,
    OpenaiApiType,
)
from graphrag.query.llm.text_utils import chunk_text
from graphrag.query.progress import StatusReporter
import ollama

class OpenAIEmbedding(BaseTextEmbedding, OpenAILLMImpl):
    """Wrapper for OpenAI Embedding models."""

    def __init__(
        self,
        api_key: str | None = None,
        azure_ad_token_provider: Callable | None = None,
        model: str = "text-embedding-3-small",
        deployment_name: str | None = None,
        api_base: str | None = None,
        api_version: str | None = None,
        api_type: OpenaiApiType = OpenaiApiType.OpenAI,
        organization: str | None = None,
        encoding_name: str = "cl100k_base",
        max_tokens: int = 8191,
        max_retries: int = 10,
        request_timeout: float = 180.0,
        retry_error_types: tuple[type[BaseException]] = OPENAI_RETRY_ERROR_TYPES,  # type: ignore
        reporter: StatusReporter | None = None,
    ):
        OpenAILLMImpl.__init__(
            self=self,
            api_key=api_key,
            azure_ad_token_provider=azure_ad_token_provider,
            deployment_name=deployment_name,
            api_base=api_base,
            api_version=api_version,
            api_type=api_type,  # type: ignore
            organization=organization,
            max_retries=max_retries,
            request_timeout=request_timeout,
            reporter=reporter,
        )

        self.model = model
        self.encoding_name = encoding_name
        self.max_tokens = max_tokens
        self.token_encoder = tiktoken.get_encoding(self.encoding_name)
        self.retry_error_types = retry_error_types

    def embed(self, text: str, **kwargs: Any) -> list[float]:
        """
        Embed text using OpenAI Embedding's sync function.

        For text longer than max_tokens, chunk texts into max_tokens, embed each chunk, then combine using weighted average.
        Please refer to: https://github.com/openai/openai-cookbook/blob/main/examples/Embedding_long_inputs.ipynb
        """
        token_chunks = chunk_text(
            text=text, token_encoder=self.token_encoder, max_tokens=self.max_tokens
        )
        chunk_embeddings = []
        chunk_lens = []
        for chunk in token_chunks:
            try:
                # openai setting
                #embedding, chunk_len = self._embed_with_retry(chunk, **kwargs)
                #chunk_embeddings.append(embedding)
                #chunk_lens.append(chunk_len)

                # ollama setting
                embedding = ollama.embeddings(model="nomic-embed-text", prompt=chunk)['embedding'] #如果要替換嵌入模型, 請修改此處的模型名稱
                chunk_lens.append(chunk)
                chunk_embeddings.append(embedding)
                chunk_lens.append(chunk_lens)                
            # TODO: catch a more specific exception
            except Exception as e:  # noqa BLE001
                self._reporter.error(
                    message="Error embedding chunk",
                    details={self.__class__.__name__: str(e)},
                )

                continue
        #chunk_embeddings = np.average(chunk_embeddings, axis=0, weights=chunk_lens)
        #chunk_embeddings = chunk_embeddings / np.linalg.norm(chunk_embeddings)
        return chunk_embeddings.tolist()

    async def aembed(self, text: str, **kwargs: Any) -> list[float]:
        """
        Embed text using OpenAI Embedding's async function.

        For text longer than max_tokens, chunk texts into max_tokens, embed each chunk, then combine using weighted average.
        """
        token_chunks = chunk_text(
            text=text, token_encoder=self.token_encoder, max_tokens=self.max_tokens
        )
        chunk_embeddings = []
        chunk_lens = []
        embedding_results = await asyncio.gather(*[
            self._aembed_with_retry(chunk, **kwargs) for chunk in token_chunks
        ])
        embedding_results = [result for result in embedding_results if result[0]]
        chunk_embeddings = [result[0] for result in embedding_results]
        chunk_lens = [result[1] for result in embedding_results]
        chunk_embeddings = np.average(chunk_embeddings, axis=0, weights=chunk_lens)  # type: ignore
        chunk_embeddings = chunk_embeddings / np.linalg.norm(chunk_embeddings)
        return chunk_embeddings.tolist()

    def _embed_with_retry(
        self, text: str | tuple, **kwargs: Any
    ) -> tuple[list[float], int]:
        try:
            retryer = Retrying(
                stop=stop_after_attempt(self.max_retries),
                wait=wait_exponential_jitter(max=10),
                reraise=True,
                retry=retry_if_exception_type(self.retry_error_types),
            )
            for attempt in retryer:
                with attempt:
                    embedding = (
                        self.sync_client.embeddings.create(  # type: ignore
                            input=text,
                            model=self.model,
                            **kwargs,  # type: ignore
                        )
                        .data[0]
                        .embedding
                        or []
                    )
                    return (embedding, len(text))
        except RetryError as e:
            self._reporter.error(
                message="Error at embed_with_retry()",
                details={self.__class__.__name__: str(e)},
            )
            return ([], 0)
        else:
            # TODO: why not just throw in this case?
            return ([], 0)

    async def _aembed_with_retry(
        self, text: str | tuple, **kwargs: Any
    ) -> tuple[list[float], int]:
        try:
            retryer = AsyncRetrying(
                stop=stop_after_attempt(self.max_retries),
                wait=wait_exponential_jitter(max=10),
                reraise=True,
                retry=retry_if_exception_type(self.retry_error_types),
            )
            async for attempt in retryer:
                with attempt:
                    embedding = (
                        await self.async_client.embeddings.create(  # type: ignore
                            input=text,
                            model=self.model,
                            **kwargs,  # type: ignore
                        )
                    ).data[0].embedding or []
                    return (embedding, len(text))
        except RetryError as e:
            self._reporter.error(
                message="Error at embed_with_retry()",
                details={self.__class__.__name__: str(e)},
            )
            return ([], 0)
        else:
            # TODO: why not just throw in this case?
            return ([], 0)

參考資料

利用 Claude Dev 幫你自動化開發程式

利用 Claude Dev 幫你自動化開發程式

Claude Dev 提供了一個 AI 自動生成程式的開發工具,融合了 VS Code 的編輯器功能和強大的 Claude 3.5 Sonnet’s 模型。這套系統融合了代碼的自動生成過程,更在軟體開發的各個階段提供了全方面的支持。

特色介紹

代碼開發和文件管理的全新模式

利用 Claude 3.5 Sonnet’s 的主動式編碼能力,Claude Dev 能夠逐步處理複雜的軟件開發任務。它不僅允許創建和編輯文件,還能探索複雜項目,並在獲得使用者許可後,執行終端機命令。

以往要採用AI開發,必須在各種AI工具以及視窗中切換,有遇到錯誤也需要手動張貼錯誤訊息,提供給AI除錯,現在超越了傳統的代碼自動完成或技術支持,為開發者提供了更全面的幫助。

AI 監督並且和使用者互動

傳統的自主AI腳本通常在沙盒環境中運行,而 Claude Dev 提供了一個圖形使用者UI,可以用來監督每一個變更的文件和執行的命令。這種方式確保了操作的安全性,並使開發者能夠安全地探索主動式 AI 的潛力。你還可以將圖片貼入聊天中,利用 Claude 的視覺能力將模型轉換成功能完整的應用程序,或者用截圖修復錯誤。

深入瞭解每一步的變更

Claude Dev 允許你直接在編輯器中查看每次更改的差異,並在聊天中通過語法高亮預覽跟踪進度。終端命令也可以直接在聊天中運行,你無需自己打開終端機。此外,每次使用工具或發送信息到 API 前,都會出現許可按鈕(例如「批准終端命令」),讓你能夠控制操作。

代碼和項目管理的高效工具

Claude Dev 擁有全面性寫程式的能力:

  • 執行系統上的終端命令
  • 列出指定目錄的頂層文件路徑
  • 遞迴列出指定目錄及其子目錄中的所有文件路徑
  • 解析頂層源代碼文件以提取關鍵元素名稱,如 Class 和 Function 等。

透由這些工具的運用,結合自然語言處理的基礎,使 Claude Dev 能夠理解代碼庫的結構和意圖,從而有效地協助開發者去開發大型和複雜的項目。

高級代碼概覽和文件結構的智能分析

從項目文件結構到高級代碼概覽,Claude Dev 使用如 tree-sitter 的工具來解析源代碼,提取出 Class 、Function、 Method 等定義。這種深度分析使 Claude Dev 能夠迅速了解代碼的結構和用途,並根據任務需要閱讀最相關的文件。

實時監控AI的成本控制

Claude Dev 也能跟踪整個任務循環和個別請求的 API 使用成本,並設定在任務中允許的最大 API 請求數量。任務完成後,Claude 可以決定是否通過如

open -a "Google Chrome" index.html

的終端命令來向你展示結果,只需點擊一下即可運行。

這些高級功能證明了 Claude Dev 不僅是代碼自動生成的工具,更是一個全面的開發環境,讓開發者能夠更有效地控制和優化他們的開發流程。通过提供一個全方位的開發解決方案,Claude Dev 真正實現了零代碼開發的未來。

參考資料

https://github.com/saoudrizwan/claude-dev

下載 VSCode Extension

ANTHROPIC API

如何使用2024年提示詞冠軍的CO-STAR框架優化Prompt

如何使用2024年提示詞冠軍的CO-STAR框架優化Prompt

在人工智慧生成內容的領域,提示詞(Prompt)設計的好壞往往決定了最終結果的質量。隨著語言模型的進步,越來越多的研究者與開發者開始探索更高效的提示詞架構。在新加坡舉辦的一場GPT-4提示詞設計競賽中,Sheila Tao通過CO-STAR的提示詞架構獲得了冠軍。這個架構為設計有效的提示詞提供了一個明確的框架,幫助使用者更精準地引導語言模型生成期望的內容。

CO-STAR框架介紹

CO-STAR是一種設計提示詞結構的模板,包含六個關鍵要素:上下文(Context)、目標(Objective)、風格(Style)、語氣(Tone)、受眾(Audience)和響應(Response)。通過這六個要素的協同作用,使用者可以更好地控制生成的內容,確保其符合特定的需求。

1. 上下文(Context)

上下文是提示詞的基礎,它提供了生成內容的背景資訊。這一部分的設計旨在讓語言模型理解當前任務的情境。上下文可以包括已有的文本、問題的背景描述,或是其他可能影響生成結果的資訊。

範例:如果你要生成一篇關於氣候變遷的文章,可以在上下文中提供相關的背景數據和問題描述,讓模型更好地理解這個主題。

2. 目標(Objective)

目標定義了提示詞的核心需求,即希望模型達成的結果。這部分明確指出你希望生成的內容應該涵蓋哪些主題或回答哪些問題。

範例:你可能會指示模型撰寫一篇關於氣候變遷的教育性文章,目的是讓大眾了解這一問題的嚴重性。

3. 風格(Style)

風格決定了生成內容的表達方式,涵蓋了文本的結構、用詞選擇等方面。不同的風格可能會影響讀者對文本的理解和感受。

範例:你可以指定內容應該以學術性的風格來撰寫,這樣會使得內容更加嚴謹和專業。

4. 語氣(Tone)

語氣影響了文本的情感表達方式,這在塑造讀者的感受方面至關重要。根據內容的不同,語氣可以是正式、非正式、幽默或是嚴肅的。

範例:在撰寫一篇新聞報導時,你可能會要求語氣保持中立和客觀。

5. 受眾(Audience)

受眾是提示詞設計中常被忽視的一個部分,但它至關重要。了解你希望吸引的讀者群體可以幫助你調整提示詞的其他要素,確保生成的內容適合這一群體的需求。

範例:如果你的文章是針對青少年,那麼語言應該更簡單易懂,風格可以更輕鬆。

6. 響應(Response)

響應是提示詞的最終結果,這是你希望模型生成的內容形式。響應可以是段落、清單、對話等多種形式,具體取決於你的需求。

範例:你可能要求模型生成一個包含多個段落的詳細分析,或是提供一個簡單的要點清單。

為什麼CO-STAR框架如此有效?

CO-STAR框架的成功在於它的結構化方法,這使得提示詞設計變得更加精確和有針對性,也就是說你已經抓到了如何當一個好的主管的精隨。當你明確了每個要素,模型能夠更好地理解你的需求,從而生成符合期望的內容。此外,這個框架也能幫助你在提示詞的不同層面上進行調整,進一步優化結果。

舉例來說,如果你對生成的內容不滿意,可能是因為上下文提供的信息不足,或是語氣與目標不符。通過CO-STAR框架,你可以更容易地找出問題所在,並進行相應的調整。

如果還不甚滿意LLM的輸出結果,建議用自己的訓練資料,並且做出關聯圖,讓語言模型好理解,我最常採用 GraphRAG 處理他

CO-STAR 注意事項

使用分隔符:

分隔符幫助語言模型(LLM)區分提示中的不同部分,尤其是指令區塊和數據區塊對於複雜任務尤其重要。

LLM防護網:

這是一種附加的額外提示,用於指示LLM應如何行為,包括任務定義、輸出格式和防護圍欄(防止LLM生成不當內容),例如要求大語言模型用指定語言輸出

使用LLM分析數據集:

不使用插件或代碼,僅採用LLM來分析數據集,這在模式識別任務中特別有用。

猜解複雜的指令:

太過長的文章以及複雜的句型,是需要被理解的,但連人類都很常誤會意思,何況是LLM,所以分割成小塊且清楚的指令才能幫助模型理解和回答

使用CO-STAR框架的示例與對比

為了更好地理解CO-STAR框架的實際應用,我們用一個具體的例子來說明它如何改善提示詞的設計。

假設我們需要生成一篇關於「如何保持工作與生活的平衡」的文章,我們將展示在沒有使用CO-STAR框架和使用後的效果對比。

沒有使用CO-STAR框架的提示詞

在沒有使用CO-STAR框架的情況下,我們可能只會簡單地輸入一個直接的提示詞:

提示詞
“寫一篇關於如何保持工作與生活平衡的文章。”

生成的內容

保持工作與生活平衡是一項挑戰,尤其是在快節奏的現代社會。人們應該設定明確的工作時間,並確保下班後有足夠的休息時間。安排時間進行娛樂活動也很重要,比如運動或與朋友聚會。這有助於減少壓力並提高整體生活質量。

分析: 這篇文章雖然提供了一些基本的建議,但內容過於簡單,沒有考慮到讀者的特定需求或語境,語氣也較為中立,缺乏吸引力,說白了,就是無聊雞肋且廢話太多的一句話,簡稱廢文。

使用CO-STAR框架的提示詞

現在,我們運用CO-STAR框架來重新設計這個提示詞,以提高生成內容的質量。

CO-STAR提示詞

  • Context(上下文):這篇文章將發布在一個專為職場人士設計的IG平台上,主要讀者是希望改善工作與生活平衡的職場中高層管理者。
  • Objective(目標):提供實際且具體的策略,幫助讀者在高壓的工作環境中維持健康的工作與生活平衡。
  • Style(風格):專業且有說服力,引用實際案例和研究數據支持論點。
  • Tone(語氣):積極且鼓勵人心,給予讀者信心去實踐建議。
  • Audience(受眾):中高層管理者,他們時間緊張,承受較大的職場壓力,但希望改善生活質量。
  • Response(響應):生成一篇包含具體步驟和案例的文章,提供可行的建議,幫助讀者實現工作與生活的平衡。

提示詞
“為職場中高層管理者撰寫一篇專業的文章,討論如何在高壓環境下維持工作與生活的平衡。這篇文章應該包括具體的策略和案例研究,並引用最新的研究數據。語氣應積極且鼓勵人心,風格應專業且有說服力。”

建議用格式化過的方法編排提示詞後,再傳給LLM

# Context #
這篇文章將發布在一個專為職場人士設計的IG平台上,主要讀者是希望改善工作與生活平衡的職場中高層管理者。

# Objective #
提供實際且具體的策略,幫助讀者在高壓的工作環境中維持健康的工作與生活平衡。

# Style #
專業且有說服力,引用實際案例和研究數據支持論點。

# Tone #
積極且鼓勵人心,給予讀者信心去實踐建議。

# Audience #
中高層管理者,他們時間緊張,承受較大的職場壓力,但希望改善生活質量。

# Response #
生成一篇包含具體步驟和案例的文章,提供可行的建議,幫助讀者實現工作與生活的平衡。

生成的內容

在現代職場中,中高層管理者往往面臨著巨大的工作壓力,如何在這樣的環境中維持工作與生活的平衡成為一項關鍵挑戰。根據哈佛商學院的最新研究,超過70%的管理者表示,壓力已經嚴重影響了他們的生活質量。為了應對這一問題,我們可以採取以下三個具體策略:

  1. 設立明確的界限:管理者應該為自己設定明確的工作時間和個人時間界限,並嚴格遵守。例如,可以在晚餐後將手機設置為勿擾模式,專注於與家人共度的時光。
  2. 尋求支持系統:建立一個由同事、家人和朋友組成的支持系統,這可以幫助管理者在壓力過大時及時得到情感和實際的支持。
  3. 實行主動管理:制定每週的工作與生活計畫,確保每週都有足夠的時間進行休閒活動,這不僅有助於減輕壓力,還能提高工作效率。

這些策略不僅能幫助管理者更好地平衡工作與生活,還能提升他們的整體生活質量。根據美國心理學會的研究,採取這些策略的管理者在工作滿意度和幸福感上都有顯著提高。

分析: 使用CO-STAR框架後,生成的內容更加具體、針對性強,並且提供了實際可操作的建議。語氣積極鼓勵,風格專業且可信,與中高層管理者的需求高度契合。

對比總結

通過這個示例,我們可以明顯看出CO-STAR框架的優勢,它不僅幫助你設計出更精確的提示詞,還確保了生成的內容更具質量和價值,相比於簡單的提示詞,CO-STAR框架能夠大幅度提升內容的針對性和專業度,使其更能滿足特定受眾的需求,話說,現在的小朋友必學提示詞的技巧,才不會淹沒在浪潮中。

參考資料

https://towardsdatascience.com/how-i-won-singapores-gpt-4-prompt-engineering-competition-34c195a93d41

https://hub.baai.ac.cn/view/37050

延伸閱讀

Prompt 設計神器:為什麼 Anthropic 是工程師的最佳秘密武器?

Prompt 設計神器:為什麼 Anthropic 是工程師的最佳秘密武器?

Anthropic 是目前市場上最強大、最實用的 Prompt 設計工具,深深地受到百萬年薪的 Prompt 工程師們喜愛,這款工具不僅提供了豐富的功能,簡潔的介面,還具備高度的靈活性,使得 Prompt 設計變得更加高效和精確,並且很強大。

Anthropic 的主要功能

Anthropic 具備多種功能,以下是其中一些最受歡迎的功能:

  1. 智能推薦:Anthropic 可以根據用戶輸入的初始 Prompt,你不用真的很會,但就可以自動生成多個優化版本,供用戶選擇和修改。
  2. 上下文理解:工具能夠理解輸入的上下文,並提供更精確和相關的建議,幫助用戶創建更符合需求的 Prompt。
  3. 多語言支持:Anthropic 支持多種語言的 Prompt 設計,無論你是使用英語、中文還是其他語言,都能夠輕鬆應對。
  4. Prompt 資料庫:透過 Prompt Library 可以協助你想像和學習 Prompt 工程,Anthropic 可以加快 Prompt 創建過程。

實際案例

案例一:內容創作

一家內容創作公司需要生成大量的文章摘要。透過 Anthropic,內容創作者能夠快速生成高質量的文章摘要,但是平常妳下達的指令只會是:

請你提供我關於文章的5個具有創意的標題

但你透過 Anthropic ,他會幫你擴展成

你是一個專業的記者,我將提供一段專業的文案給你參考,你需要按照這個文案的風格,創作出5個具有創意的標題

以下是參考的文案內容 <content> {{CONTENT}} </content>

請按照以下的步驟創作標題

1.仔細閱讀文案內容

2.找出可以抓住眼球和注意力的主題和亮點

3.標題要簡潔且有力在20個字內

4.選出5個最佳方案

是不是變的強大了很多,也專業很多,這也代表你變成一個很懂AI的老闆了

使用技巧

  1. 充分利用智能推薦:在設計初期,充分利用 Anthropic 的智能推薦功能,快速生成多個可行的 Prompt 範本,然後根據具體需求進行細化。
  2. 多次迭代:不要期望一次性完成完美的 Prompt,多次迭代和調整是關鍵。每次修改後都可以使用工具的建議來進一步優化。
  3. 結合上下文:在設計 Prompt 時,充分考慮上下文因素,使得生成的內容更加連貫和自然。Anthropic 的上下文理解功能在這方面大有幫助。
  4. 多語言測試:如果需要設計多語言的 Prompt,建議在不同語言環境下進行測試和調整,確保每個語言版本的質量和效果一致。

注意事項

工具很強大,是可以付費支持,並且讓自己的生活更美好的,他現在要使用是需要點數的,強烈建議可以試試

參考資料

Anthropic Console