#!/bin/bash

# 루트 권한 체크
if [ "$EUID" -ne 0 ]; then
    echo "루트 권한으로 실행해주세요."
    exit 1
fi

# 사용자 정보 입력받기
read -p "생성할 사용자 이름: " username
read -p "사용자 실제 이름: " realname
read -s -p "초기 비밀번호: " password
echo

# 사용자가 이미 존재하는지 확인
if id "$username" &>/dev/null; then
    echo "사용자 $username 가 이미 존재합니다."
    exit 1
fi

# 사용자 생성
useradd -m -s /bin/bash "$username"

# 비밀번호 설정
echo "$username:$password" | chpasswd

# 홈 디렉토리 권한 설정
chmod 700 /home/$username
chown $username:$username /home/$username

# 사용자의 기본 그룹만 유지하고 다른 그룹에서 제거
usermod -G "" "$username"

# 첫 로그인시 비밀번호 변경 강제
chage -d 0 "$username"

# 결과 출력
echo "사용자 계정이 생성되었습니다:"
echo "사용자명: $username"
echo "홈 디렉토리: /home/$username"
echo "권한 설정: 홈 디렉토리만 접근 가능"

terraform.tfstate 파일을 삭제하면 안되는 이유

terraform.tfstate 파일을 삭제하면 안되는 주요 이유들을 다음과 같이 설명할 수 있습니다:

## 인프라 상태 관리 손실

terraform.tfstate 파일은 Terraform이 관리하는 인프라의 현재 상태를 저장하는 핵심 파일입니다[1]. 이 파일이 삭제되면:

- Terraform이 기존에 생성한 리소스들의 상태 정보를 잃게 됩니다
- 실제 인프라와 Terraform 코드 간의 매핑 정보가 사라집니다
- 리소스들 간의 의존성 정보가 손실됩니다[1]

## 리소스 관리의 어려움

상태 파일이 삭제되면 다음과 같은 문제가 발생합니다:

- Terraform이 기존 리소스를 인식하지 못해 동일한 리소스를 중복 생성하려고 시도합니다[6]
- 리소스 수정이나 삭제가 어려워집니다
- terraform destroy 명령어로 리소스를 정리할 수 없게 됩니다[6]

## 인프라 불일치 문제

상태 파일 없이 Terraform을 실행하면:

- 실제 인프라와 코드 간의 차이를 파악할 수 없습니다[2]
- 리소스의 현재 상태를 추적할 수 없게 됩니다
- 의도하지 않은 리소스 변경이나 충돌이 발생할 수 있습니다[1]

## 권장 사항

상태 파일의 안전한 관리를 위해:

- 상태 파일을 S3, Azure Blob Storage 같은 원격 백엔드에 저장합니다[5]
- 상태 파일 잠금(State Locking) 기능을 사용하여 동시 수정을 방지합니다[5]
- 정기적으로 백업을 수행하고 버전 관리를 합니다[5]
- Git과 같은 소스 컨트롤에는 저장하지 않습니다[1]

인용:
[1] [Terraform] 인프라 리소스 관리 - state와 backend https://omoknooni.tistory.com/72
[2] State File in Terraform: What Do You Need to Know? - Anywhere Club https://aw.club/global/en/blog/state-file-in-terraform-what-you-need-to-know
[3] Recovering Lost Terraform State for Accidental Deletion or Corruption https://www.linkedin.com/pulse/recovering-lost-terraform-state-accidental-deletion-corruption-hoang
[4] State | Terraform - HashiCorp Developer https://developer.hashicorp.com/terraform/language/state
[5] What is Terraform State File? Explained With Examples https://blog.techiescamp.com/terraform-state-file/
[6] TerraWeek#Day 4-Importance of State in Terraform - Gajanan https://gajananb.hashnode.dev/terraweekday-4-importance-of-state-in-terraform
[7] Managing Terraform State - Best Practices & Examples - Spacelift https://spacelift.io/blog/terraform-state


terraform.tfstate 파일이 꼬이지 않아?
이유와 해결방법 알려줘

terraform.tfstate 파일이 꼬이는 주요 원인과 해결방법을 설명해드리겠습니다.

## 문제 발생 원인

1. **동시 작업으로 인한 충돌**
- 여러 사용자가 동시에 같은 상태 파일을 수정할 때 발생[2]
- 상태 파일의 부정합과 Race Condition 발생 가능성[2]

2. **부적절한 상태 파일 관리**
- 로컬에서만 상태 파일을 관리할 경우 발생[2]
- Git과 같은 소스 컨트롤에 직접 저장 시 문제 발생[2]

## 해결 방안

**1. 원격 백엔드 구성**

```hcl
terraform {
  backend "s3" {
    bucket = "terraform-state-bucket"
    key    = "terraform.tfstate"
    region = "ap-northeast-2"
    dynamodb_table = "terraform-lock"
    encrypt = true
  }
}
```

**2. DynamoDB를 이용한 State Locking 구현**

```hcl
resource "aws_dynamodb_table" "terraform_lock" {
  name           = "terraform-lock"
  billing_mode   = "PAY_PER_REQUEST"
  hash_key       = "LockID"
  attribute {
    name = "LockID"
    type = "S"
  }
}
```

**3. S3 버킷 버전관리 활성화**

```hcl
resource "aws_s3_bucket_versioning" "terraform_state" {
  bucket = aws_s3_bucket.terraform_state.id
  versioning_configuration {
    status = "Enabled"
  }
}
```

## 권장 사항

1. **상태 파일 중앙화**
- S3와 같은 원격 저장소 사용[2]
- 팀원 간 동일한 상태 파일 참조 가능[5]

2. **버전 관리**
- S3 버킷의 버전관리 기능 활성화[3]
- 상태 파일 변경 이력 추적 가능

3. **잠금 메커니즘 사용**
- DynamoDB를 통한 State Locking 구현[5]
- 동시 작업 방지 및 데이터 일관성 유지

4. **백업 관리**
- 상태 파일의 자동 백업 구성[5]
- 문제 발생 시 복구 가능성 확보

이러한 조치들을 통해 terraform.tfstate 파일의 무결성을 유지하고 안전하게 관리할 수 있습니다.

인용:
[1] Terraform State file의 Terraform 버전 변경하기 (AWS 기준) - velog https://velog.io/@jay-side-project/Terraform-State-file%EC%9D%98-Terraform-%EB%B2%84%EC%A0%84-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0-AWS-%EA%B8%B0%EC%A4%80
[2] [Terraform] 인프라 리소스 관리 - state와 backend https://omoknooni.tistory.com/72
[3] Terraform의 tfstate를 원격으로 관리하기 https://blog.outsider.ne.kr/1290
[4] Terraform 상태 관리하기 - velog https://velog.io/@jaehan/Terraform-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0
[5] [Terraform] 테라폼 Locking과 Backup (S3, DynamoDB) - kim.dragon https://kim-dragon.tistory.com/210
[6] 테라폼 Terraform 리소스 변경, 삭제 - 두두네 클라우드 - 티스토리 https://daaa0555.tistory.com/369
[7] 32탄-9. 4주 차-테라폼-State의 목적과 의미 - 브런치스토리 https://brunch.co.kr/@topasvga/3382
[8] 테라폼 t102 스터디 - state - 악분의 블로그 https://malwareanalysis.tistory.com/633







github actions로 terraform 리소스를 배포하고 있어.
강제 종료 시 에러가 왜 나는지 설명해주고, 조치 방안을 step by step으로 자세히 알려줘

GitHub Actions에서 Terraform 배포 중 강제 종료 시 발생하는 문제와 해결 방안을 설명해드리겠습니다.

## 문제 원인

GitHub Actions에서 Terraform 작업을 강제 종료하면 다음과 같은 문제가 발생합니다:

1. 상태 파일이 잠금 상태로 유지되어 후속 Terraform 작업이 실행되지 않습니다[3].
2. 작업이 정상적으로 종료되지 않아 상태 파일이 비어있거나 동기화되지 않을 수 있습니다[3].
3. 리소스는 생성되었지만 상태 파일에 기록되지 않아 관리가 어려워질 수 있습니다[3].

## 해결 방안

**1. 워크플로우 설정 개선**

```yaml
name: Terraform Deployment
on:
  push:
    branches: [ main ]
jobs:
  terraform:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      
      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v1
        
      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}
          
      - name: Terraform Init
        id: init
        run: terraform init
        
      - name: Terraform Plan
        id: plan
        run: terraform plan -out=tfplan
        
      - name: Manual Approval
        uses: trstringer/manual-approval@v1
        with:
          secret: ${{ github.TOKEN }}
          approvers: username1,username2
          minimum-approvals: 1
          issue-title: "Terraform Deployment Approval Required"[2]
```

**2. 상태 잠금 해제 절차**

1. DynamoDB 테이블에서 잠금 확인:
```bash
aws dynamodb get-item --table-name terraform-state-lock --key '{"LockID":{"S":"terraform-state"}}'
```

2. 강제 잠금 해제:
```bash
terraform force-unlock [LOCK_ID]
```[4]

**3. 상태 파일 복구**

1. S3 버킷에서 이전 상태 파일 버전 확인[3]
2. 최신 유효한 버전으로 복원
3. Terraform 상태 새로고침:
```bash
terraform refresh
```

## 예방 조치

1. **종료 트랩 설정**
```yaml
- name: Terraform Apply
  run: |
    trap "terraform force-unlock -force $(terraform state pull | jq -r '.serial')" EXIT
    terraform apply -auto-approve
```[3]

2. **권한 설정 확인**
- S3 버킷에 대한 DeleteObject 권한
- DynamoDB 테이블에 대한 DeleteItem 권한 추가[4]

3. **타임아웃 설정**
```yaml
jobs:
  terraform:
    timeout-minutes: 30
```

4. **승인 프로세스 추가**
- 프로덕션 환경 배포 전 수동 승인 단계 구현[2]
- 계획 결과 검토를 위한 이슈 생성

이러한 조치들을 통해 강제 종료로 인한 문제를 최소화하고, 발생 시 신속하게 복구할 수 있습니다.

인용:
[1] Can't have a terraform plan work from a github action (related to ... https://github.com/hashicorp/terraform-github-actions/issues/84
[2] Automating Terraform Deployments with GitHub Actions: A Step-by ... https://nordcloud.com/tech-community/automating-terraform-deployments-with-github-actions-a-step-by-step-guide/
[3] GitHub Actions. Canceled action leads to permanently locked state. https://www.reddit.com/r/Terraform/comments/11u508t/deploying_w_github_actions_canceled_action_leads/
[4] Error acquiring the state lock: ConditionalCheckFailedException https://stackoverflow.com/questions/62189825/error-acquiring-the-state-lock-conditionalcheckfailedexception
[5] Troubleshooting: GitHub Actions + Terraform + EKS + Helm https://dev.to/aws-builders/troubleshooting-github-actions-terraform-eks-helm-3khj
[6] Terraform with GitHub Actions : How to Manage & Scale - Spacelift https://spacelift.io/blog/github-actions-terraform

crew ai의 주요 기능에 대해서 팀원들한테 설명하려고 해.
샘플 코드와 함께 agent, task, tool 위주로 설명 작성해줘

CrewAI의 주요 기능에 대해 팀원들에게 설명하기 위해 Agent, Task, Tool을 중심으로 샘플 코드와 함께 설명을 작성해 드리겠습니다.

## CrewAI 주요 기능

CrewAI는 여러 AI 에이전트가 협력하여 복잡한 작업을 수행할 수 있게 해주는 프레임워크입니다. 주요 구성 요소는 Agent, Task, Tool입니다.

### 1. Agent (에이전트)

Agent는 특정 역할을 수행하는 AI 개체입니다. 각 에이전트는 고유한 역할, 목표, 배경 스토리를 가지고 있습니다.

```python
from crewai import Agent

researcher = Agent(
    role='연구원',
    goal='최신 AI 트렌드 분석',
    backstory='AI 분야에서 10년 경력을 가진 전문 연구원',
    verbose=True,
    allow_delegation=False
)

writer = Agent(
    role='작가',
    goal='연구 결과를 바탕으로 블로그 글 작성',
    backstory='기술 블로그 전문 작가로 5년간 활동 중',
    verbose=True,
    allow_delegation=False
)
```

### 2. Task (작업)

Task는 에이전트가 수행해야 할 구체적인 작업을 정의합니다.

```python
from crewai import Task

research_task = Task(
    description='2024년 AI 트렌드 조사 및 보고서 작성',
    agent=researcher
)

writing_task = Task(
    description='연구 보고서를 바탕으로 블로그 글 작성',
    agent=writer
)
```

### 3. Tool (도구)

Tool은 에이전트가 작업을 수행하는 데 사용하는 도구입니다. CrewAI는 다양한 내장 도구를 제공하며, 사용자 정의 도구도 만들 수 있습니다.

```python
from crewai import Tool
from langchain.tools import DuckDuckGoSearchRun

search_tool = Tool(
    name='인터넷 검색',
    func=DuckDuckGoSearchRun().run,
    description='최신 정보를 인터넷에서 검색합니다.'
)

researcher.add_tool(search_tool)
```

### 크루 구성 및 실행

Agent, Task, Tool을 정의한 후, Crew를 구성하고 작업을 실행합니다.

```python
from crewai import Crew

crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, writing_task],
    verbose=2
)

result = crew.kickoff()
print(result)
```

이 예제에서는 연구원과 작가 두 명의 에이전트가 협력하여 AI 트렌드 조사 및 블로그 글 작성 작업을 수행합니다. 연구원은 인터넷 검색 도구를 사용하여 정보를 수집하고, 작가는 이를 바탕으로 글을 작성합니다[1][2][3].

CrewAI를 사용하면 복잡한 작업을 여러 에이전트가 협력하여 효율적으로 처리할 수 있으며, 각 에이전트의 전문성을 활용하여 높은 품질의 결과물을 얻을 수 있습니다[4][5].

인용:
[1] crewai - 다중 AI 에이전트 협업 프레임워크 - TILNOTE https://tilnote.io/pages/66b05156788ca90bdea6d80d
[2] Crew AI로 에이전트 행동 구현하기 - Toolify AI https://www.toolify.ai/ko/ai-news-kr/crew-ai-1863091
[3] CrewAI로 나만의 AI Agent 만들기 https://devocean.sk.com/blog/techBoardDetail.do?ID=166150&boardType=techBlog
[4] Crew AI로 AI 에이전트 팀을 몇 분 안에 구축하기! https://www.toolify.ai/ko/ai-news-kr/crew-ai-ai-1317636
[5] CrewAI를 이용한 대규모 언어 모델 Solar와 Hermes의 협업 프로젝트 https://fornewchallenge.tistory.com/entry/CrewAI%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%8C%80%EA%B7%9C%EB%AA%A8-%EC%96%B8%EC%96%B4-%EB%AA%A8%EB%8D%B8-Solar%EC%99%80-Hermes%EC%9D%98-%ED%98%91%EC%97%85-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8


https://www.perplexity.ai/search/crewaie-daehaeseo-seolmyeongha-vJuDa0STTbWS2zjVTjnXdQ#2

## 기본 설정

먼저 필요한 라이브러리를 임포트하고 기본 설정을 합니다.

```python
from crewai import Agent, Task, Crew
from langchain.tools import DuckDuckGoSearchRun

# 검색 도구 설정
search_tool = DuckDuckGoSearchRun()
```

## 에이전트 정의

블로그 포스트 작성에 필요한 세 가지 역할의 에이전트를 정의합니다.

```python
# 연구원 에이전트
researcher = Agent(
    role='연구원',
    goal='주제에 대한 최신 정보와 통계를 수집',
    backstory='당신은 꼼꼼하고 정확한 정보를 찾아내는 전문 연구원입니다.',
    tools=[search_tool],
    verbose=True
)

# 작가 에이전트
writer = Agent(
    role='작가',
    goal='흥미롭고 정보가 풍부한 블로그 포스트 작성',
    backstory='당신은 복잡한 주제를 쉽게 설명할 수 있는 재능 있는 작가입니다.',
    tools=[search_tool],
    verbose=True
)

# 편집자 에이전트
editor = Agent(
    role='편집자',
    goal='글의 품질을 높이고 일관성 있는 톤을 유지',
    backstory='당신은 꼼꼼한 교정과 건설적인 피드백을 제공하는 경험 많은 편집자입니다.',
    tools=[search_tool],
    verbose=True
)
```

## 작업 정의

각 에이전트에게 할당할 작업을 정의합니다.

```python
task1 = Task(
    description='AI와 기후 변화에 대한 최신 연구와 통계를 수집하세요.',
    agent=researcher
)

task2 = Task(
    description='수집된 정보를 바탕으로 "AI가 기후 변화 대응에 미치는 영향"에 대한 1500자 블로그 포스트를 작성하세요.',
    agent=writer
)

task3 = Task(
    description='작성된 블로그 포스트를 검토하고 필요한 수정사항을 제안하세요.',
    agent=editor
)
```

## 크루 생성 및 실행

정의된 에이전트와 작업으로 크루를 구성하고 실행합니다.

```python
crew = Crew(
    agents=[researcher, writer, editor],
    tasks=[task1, task2, task3],
    verbose=2
)

result = crew.kickoff()
print(result)
```

## 실행 과정

이 코드를 실행하면 다음과 같은 과정이 진행됩니다:

1. 연구원 에이전트가 AI와 기후 변화에 관한 최신 정보를 수집합니다.
2. 작가 에이전트가 수집된 정보를 바탕으로 블로그 포스트를 작성합니다.
3. 편집자 에이전트가 작성된 포스트를 검토하고 피드백을 제공합니다.
4. 최종 결과물이 출력됩니다.

이 예제는 CrewAI의 기본적인 사용 방법을 보여줍니다. 실제 사용 시에는 더 복잡한 작업 흐름과 추가적인 도구를 통합할 수 있습니다. 예를 들어, 특정 API를 사용하여 실시간 데이터를 가져오거나, 자연어 처리 도구를 통합하여 텍스트 분석을 수행할 수 있습니다.

CrewAI의 강점은 이러한 복잡한 작업 흐름을 여러 전문화된 에이전트가 협력하여 수행할 수 있다는 점입니다. 각 에이전트는 자신의 역할에 집중하면서도 다른 에이전트와 정보를 교환하고 협력하여 전체 작업의 품질을 높일 수 있습니다.


Meta가 최근 Llama 3.2라는 최신 대규모 언어 모델(LLM) 컬렉션을 공개했습니다. 이는 AI 기술의 중요한 발전을 보여주는 사건입니다. 이번 신규 출시는 이전 버전들에 비해 여러 혁신적인 기능과 개선사항을 선보입니다.

 

Llama 3.2의 주요 특징

  1. 다중 모달 기능: Meta는 Llama 시리즈에서 처음으로 비전 모델을 도입했습니다. Llama 3.2 11B Vision과 90B Vision 모델은 텍스트와 이미지 입력을 모두 처리할 수 있어 고급 시각적 추론 작업이 가능합니다.
  2. 경량 모델: Llama 3.2는 1B와 3B 파라미터 모델을 포함하며, 이는 Meta의 첫 소형 언어 모델(SLM)입니다. 이 모델들은 기기 내 및 엣지 컴퓨팅용으로 설계되어 로컬 추론과 저비용 에이전트 애플리케이션을 가능하게 합니다.
  3. 다국어 지원: 이 모델들은 다국어 대화 사용 사례에 최적화되어 있으며, 공식적으로 영어, 독일어, 프랑스어, 이탈리아어, 포르투갈어, 힌디어, 스페인어, 태국어를 지원합니다.
  4. 성능 향상: Llama 3.2 모델은 일반적인 산업 벤치마크에서 많은 오픈소스 및 비공개 채팅 모델들을 능가하는 성능을 보여줍니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

응용 분야 및 사용 사례

  • 기업 수준 애플리케이션: 90B Vision 모델은 일반 지식, 장문 텍스트 생성, 다국어 번역, 코딩, 수학, 고급 추론 분야에서 뛰어납니다.
  • 콘텐츠 생성 및 AI 어시스턴트: 11B Vision 모델은 콘텐츠 생성, 대화형 AI, 언어 이해 작업에 적합합니다.
  • 엣지 컴퓨팅: 1B와 3B 모델은 개인 정보 관리, 다국어 지식 검색, 모바일 애플리케이션에 이상적입니다.
  • 시각적 작업: 비전 모델은 이미지 캡셔닝, 시각적 질문 답변, 문서 처리, 멀티모달 챗봇 기능을 수행할 수 있습니다.

기술 사양

  • 아키텍처: Llama 3.2는 자동 회귀 언어 모델링을 위한 최적화된 트랜스포머 아키텍처를 사용합니다.
  • 훈련 기법: 모델들은 지도 학습 미세 조정(SFT)과 인간 피드백을 통한 강화 학습(RLHF)을 사용합니다.
  • 컨텍스트 길이: 최대 128k 토큰.
  • 토큰 수: 최대 9T 토큰.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

가용성 및 배포

Llama 3.2 모델은 현재 다양한 플랫폼에서 사용 가능합니다:

 

  • Amazon Bedrock 및 AWS 서비스
  • Microsoft Azure AI 모델 카탈로그
  • IBM의 watsonx.ai 플랫폼
  • 로컬 배포를 위한 Ollama

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

AI 생태계에 미치는 영향

Llama 3.2의 출시는 오픈소스 AI 모델 분야에서 중요한 진전을 나타냅니다. 다중 모달 기능과 경량 버전은 기업 애플리케이션부터 모바일 및 엣지 컴퓨팅에 이르기까지 다양한 분야에서 혁신을 이끌 것으로 예상됩니다.

 

특히 에이전트 AI 작업에서 뛰어난 성능을 보이는 이 모델들은 시장의 다른 주요 AI 모델들과 강력한 경쟁자로 자리매김할 것으로 보입니다.AI 분야가 빠르게 발전함에 따라, Llama 3.2의 개방성과 유연성은 개발자와 연구자들에게 새로운 기회를 제공하며, 이는 잠재적으로 새로운 AI 기반 애플리케이션과 서비스의 물결을 일으킬 수 있을 것입니다.

 

 

아래는 LM Studio에서 LLAMA3.2 기반 앱을 실행하는 영상과 소스코드입니다 :

 

 

 

 

1. Base Code

# Example: reuse your existing OpenAI setup
from openai import OpenAI

# Point to the local server
client = OpenAI(base_url="http://<Your IP>:5555/v1", api_key="lm-studio")


completion = client.chat.completions.create(
  model="lmstudio-community/Llama-3.2-3B-Instruct-GGUF",
  messages=[
    {"role": "system", "content": "Always answer in rhymes."},
    {"role": "user", "content": "Introduce yourself."}
  ],
  temperature=0.7,
)

print(completion.choices[0].message)

 

 

2. Streamlit 앱 코드 (Stream 응답 방식)

 

import streamlit as st
from openai import OpenAI

# OpenAI 클라이언트 설정
@st.cache_resource
def get_openai_client():
    return OpenAI(base_url="http://<Your IP>:5555/v1", api_key="lm-studio")

client = get_openai_client()

st.title("LM Studio 채팅 앱")

# 세션 상태 초기화
if "messages" not in st.session_state:
    st.session_state.messages = [
        {"role": "system", "content": "You are helpful instance."}
    ]

# 채팅 메시지를 표시할 컨테이너
chat_container = st.container()

# 입력 필드를 화면 하단에 고정
input_container = st.container()

# 대화 내용 표시
with chat_container:
    for message in st.session_state.messages:
        if message["role"] != "system":
            with st.chat_message(message["role"]):
                st.write(message["content"])

# 사용자 입력 (화면 하단에 위치)
with input_container:
    user_input = st.text_input("메시지를 입력하세요:", key="user_input")
    send_button = st.button("전송")

if send_button and user_input:
    # 사용자 메시지 추가
    st.session_state.messages.append({"role": "user", "content": user_input})
    
    with chat_container:
        with st.chat_message("user"):
            st.write(user_input)
        
        with st.chat_message("assistant"):
            message_placeholder = st.empty()
            full_response = ""
            
            # 스트리밍 응답
            for response in client.chat.completions.create(
                model="lmstudio-community/Llama-3.2-3B-Instruct-GGUF",
                messages=st.session_state.messages,
                temperature=0.7,
                stream=True
            ):
                full_response += (response.choices[0].delta.content or "")
                message_placeholder.markdown(full_response + "▌")
            
            message_placeholder.markdown(full_response)
    
    # 최종 응답 메시지 추가
    st.session_state.messages.append({"role": "assistant", "content": full_response})
    
    # 입력 필드 초기화 (st.session_state 사용하지 않음)
    st.rerun()

# 스크롤을 항상 최하단으로 이동
st.markdown('<script>window.scrollTo(0, document.body.scrollHeight);</script>', unsafe_allow_html=True)

 

한국의 AI 기술 발전이 새로운 국면을 맞이했습니다. LG전자가 최근 공개한 LG Exaone 3.0은 한국어를 가장 잘 이해하고 구사하는 AI 언어 모델로 주목받고 있습니다.

 

 

 

이 혁신적인 한국어 AI 모델의 등장으로 국내 AI 기술이 한 단계 도약했다는 평가를 받고 있습니다.

 

 

 

 

 

 

 

 

LG Exaone 3.0: 최고의 한국어 AI 모델

LG Exaone 3.0은 현존하는 AI 모델 중 한국어 능력이 가장 뛰어난 것으로 알려져 있습니다. 이 AI 모델은 방대한 한국어 데이터를 학습하여 자연스러운 한국어 대화와 텍스트 생성이 가능합니다. LG AI 연구소의 기술력이 집약된 LG Exaone 3.0은 한국어 특성을 깊이 이해하고 활용할 수 있는 AI 모델로 평가받고 있습니다.

 

 

 

 

한국어 AI의 혁신: LG Exaone 3.0의 특징

LG Exaone 3.0이 다른 AI 모델과 차별화되는 주요 특징은 다음과 같습니다:

  1. 정확한 한국어 이해: 복잡한 한국어 문맥과 뉘앙스를 정확히 파악합니다.
  2. 자연스러운 한국어 생성: 한국인의 언어 습관을 반영한 자연스러운 문장을 만들어냅니다.
  3. 한국 문화 이해: 한국의 문화적 배경을 고려한 대화가 가능합니다.
  4. 다양한 한국어 표현: 공식적인 문서부터 일상 대화까지 상황에 맞는 표현을 구사합니다.

 

 

 

 

 

 

 

 

 

LG Exaone 3.0이 여는 한국어 AI의 미래

LG Exaone 3.0의 공개는 한국어 AI 발전에 큰 의미를 지닙니다. 이 AI 모델은 다음과 같은 분야에서 활용될 것으로 기대됩니다:

  • 고객 서비스: 정확한 한국어 이해를 바탕으로 한 AI 상담 서비스
  • 콘텐츠 생성: 한국어 문서, 기사, 스크립트 등의 자동 생성
  • 번역 및 통역: 고품질의 한국어-외국어 번역 서비스
  • 교육: 한국어 학습자를 위한 맞춤형 AI 튜터

 

한국어 AI의 새로운 지평

LG Exaone 3.0의 등장으로 한국어 AI 기술은 새로운 지평을 열게 되었습니다. 이 AI 모델은 한국어에 특화된 성능으로 다양한 산업 분야에서 혁신을 이끌 것으로 예상됩니다. LG AI 연구소의 LG Exaone 3.0은 한국의 AI 기술력을 세계에 알리는 동시에, 한국어 사용자들에게 더욱 정교하고 유용한 AI 서비스를 제공할 것으로 예상됩니다.

LG Exaone 3.0과 함께 한국어 AI의 미래가 기대됩니다^^

 

 

 

 

 

 

 

 

 

 

아래는 LM Studio에서 Exaone3.0기반 앱을 실행하는 영상과 소스코드입니다 :

https://youtu.be/PLmN4JAKSU0

 

- YouTube

 

www.youtube.com

 

 

 

1. Base Code

# Example: reuse your existing OpenAI setup
from openai import OpenAI

# Point to the local server
client = OpenAI(base_url="http://<Your IP>:5555/v1", api_key="lm-studio")

completion = client.chat.completions.create(
  model="Bingsu/exaone-3.0-7.8b-it",
  messages=[
    {"role": "system", "content": "너는 유용한 AI Assistant야."},
    {"role": "user", "content": "너를 소개해봐."}
  ],
  temperature=0.7,
)

print(completion.choices[0].message)

 

 

2. Streamlit 앱 코드 (Stream 응답 방식)

 

import streamlit as st
from openai import OpenAI

# OpenAI 클라이언트 설정
@st.cache_resource
def get_openai_client():
    return OpenAI(base_url="http://<Your IP>:5555/v1", api_key="lm-studio")

client = get_openai_client()

st.title("LM Studio 채팅 앱")

# 세션 상태 초기화
if "messages" not in st.session_state:
    st.session_state.messages = [
        {"role": "system", "content": "한글로 대답해줘."}
    ]

# 채팅 메시지를 표시할 컨테이너
chat_container = st.container()

# 입력 필드를 화면 하단에 고정
input_container = st.container()

# 대화 내용 표시
with chat_container:
    for message in st.session_state.messages:
        if message["role"] != "system":
            with st.chat_message(message["role"]):
                st.write(message["content"])

# 사용자 입력 (화면 하단에 위치)
with input_container:
    user_input = st.text_input("메시지를 입력하세요:", key="user_input")
    send_button = st.button("전송")

if send_button and user_input:
    # 사용자 메시지 추가
    st.session_state.messages.append({"role": "user", "content": user_input})
    
    with chat_container:
        with st.chat_message("user"):
            st.write(user_input)
        
        with st.chat_message("assistant"):
            message_placeholder = st.empty()
            full_response = ""
            
            # 스트리밍 응답
            for response in client.chat.completions.create(
                model="Bingsu/exaone-3.0-7.8b-it",
                messages=st.session_state.messages,
                temperature=0.7,
                stream=True
            ):
                full_response += (response.choices[0].delta.content or "")
                message_placeholder.markdown(full_response + "▌")
            
            message_placeholder.markdown(full_response)
    
    # 최종 응답 메시지 추가
    st.session_state.messages.append({"role": "assistant", "content": full_response})
    
    # 입력 필드 초기화 (st.session_state 사용하지 않음)
    st.rerun()

# 스크롤을 항상 최하단으로 이동
st.markdown('<script>window.scrollTo(0, document.body.scrollHeight);</script>', unsafe_allow_html=True)

+ Recent posts