성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 그냥 RSS Reader 기능과 약간의 UI 편의성 때문에 사용...
[이종효] 오래된 소프트웨어는 보안 위협이 되기도 합니다. 혹시 어떤 기능...
[정성태] @Keystroke IEEE의 문서를 소개해 주시다니... +_...
[손민수 (Keystroke)] 괜히 듀얼채널 구성할 때 한번에 같은 제품 사라고 하는 것이 아...
[정성태] 전각(Full-width)/반각(Half-width) 기능을 토...
[정성태] Vector에 대한 내용은 없습니다. Vector가 닷넷 BCL...
[orion] 글 읽고 찾아보니 디자인 타임에는 InitializeCompon...
[orion] 연휴 전에 재현 프로젝트 올리자 생각해 놓고 여의치 않아서 못 ...
[정성태] 아래의 글에 정리했으니 참고하세요. C# - Typed D...
[정성태] 간단한 재현 프로젝트라도 있을까요? 저런 식으로 설명만 해...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>C# - Semantic Kernel의 "Basic Loading of the Kernel" 예제</h1> <p> 아래의 예제를 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Breadcrumbssemantic-kernel/samples/notebooks/dotnet/01-basic-loading-the-kernel.ipynb ; <a target='tab' href='https://github.com/microsoft/semantic-kernel/blob/main/samples/notebooks/dotnet/01-basic-loading-the-kernel.ipynb'>https://github.com/microsoft/semantic-kernel/blob/main/samples/notebooks/dotnet/01-basic-loading-the-kernel.ipynb</a> </pre> <br /> Kernel 개체를 <a target='tab' href='https://learn.microsoft.com/en-us/dotnet/core/extensions/generic-host'>Generic Host</a>처럼 초기화하는 것을 보여줍니다.<br /> <br /> 해당 코드에서는 NullLogger를 사용해서,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ILogger myLogger = NullLogger.Instance; IKernel kernel_2 = Kernel.Builder .WithLogger(myLogger) .Build(); </pre> <br /> 아무런 출력이 없지만 이것을 우리가 임의로 만든 ConsoleLogger로,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using Microsoft.Extensions.Logging; namespace ConsoleApp1; // <a target='tab' href='https://learn.microsoft.com/en-us/dotnet/core/extensions/custom-logging-provider'>https://learn.microsoft.com/en-us/dotnet/core/extensions/custom-logging-provider</a> public class ConsoleLogger : ILogger { public IDisposable? BeginScope<TState>(TState state) where TState : notnull => default!; public bool IsEnabled(LogLevel logLevel) { return true; } public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter) { Console.WriteLine(formatter(state, exception)); } } </pre> <br /> <a target='tab' href='https://www.sysnet.pe.kr/2/0/13345#code1'>지난번 글의 summarize 함수</a>와 연결해 열역학 법칙에 대해서만 테스트해 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > private static async Task<int> Main(string[] args) { // ...[생략]... <span style='color: blue; font-weight: bold'>ILogger myLogger = new ConsoleLogger();</span> var kernel = Kernel.Builder <span style='color: blue; font-weight: bold'>.WithLogger(myLogger)</span> .Build(); // ...[생략]... var prompt = @"{{$input}} One line TLDR with the fewest words."; var summarize = kernel.CreateSemanticFunction(prompt); string text1 = @" 1st Law of Thermodynamics - Energy cannot be created or destroyed. 2nd Law of Thermodynamics - For a spontaneous process, the entropy of the universe increases. 3rd Law of Thermodynamics - A perfect crystal at zero Kelvin has zero entropy."; Console.WriteLine(await summarize.InvokeAsync(text1)); return 0; } </pre> <br /> 이런 결과를 얻게 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Extracting blocks from template: {{$input}} One line TLDR with the fewest words. Rendering string template: {{$input}} One line TLDR with the fewest words. Extracting blocks from template: {{$input}} One line TLDR with the fewest words. Rendering list of 2 blocks Rendered prompt: 1st Law of Thermodynamics - Energy cannot be created or destroyed. 2nd Law of Thermodynamics - For a spontaneous process, the entropy of the universe increases. 3rd Law of Thermodynamics - A perfect crystal at zero Kelvin has zero entropy. One line TLDR with the fewest words. Energy conserved, entropy increases, zero entropy at 0K. </pre> <br /> <hr style='width: 50%' /><br /> <a name='config'></a> <br /> 자, 그다음 KernelConfig도 이렇게 바꿔서 초기화할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <span style='color: blue; font-weight: bold'>KernelConfig kernelConfig = new KernelConfig(); kernelConfig.AddOpenAITextCompletionService( "davinci-openai", "text-davinci-003", // OpenAI Model name apiKey // OpenAI API Key );</span> ILogger myLogger = new ConsoleLogger(); var kernel = Kernel.Builder .WithLogger(myLogger) <span style='color: blue; font-weight: bold'>.WithConfiguration(kernelConfig)</span> .Build(); </pre> <br /> kernelConfig에는 1개 이상의 서비스를 연결해 둘 수 있는데요, 예를 들어 아래는 OpenAI와 Azure OpenAI 서비스를 함께 지정하고 있습니다. (혹은 동일한 OpenAI여도 Model 이름이 다른 서비스를 추가할 수도 있습니다.)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > kernelConfig.AddAzureTextCompletionService( "Azure_curie", // alias used in the prompt templates' config.json "my-finetuned-Curie", // Azure OpenAI *Deployment ID* "https://contoso.openai.azure.com/", // Azure OpenAI *Endpoint* "...your Azure OpenAI Key..." // Azure OpenAI *Key* ); kernelConfig.AddOpenAITextCompletionService( "davinci-openai", "text-davinci-003", // OpenAI Model name apiKey // OpenAI API Key ); </pre> <br /> 저렇게 2개의 서비스를 추가한 경우, 기본적으로 첫 번째 서비스가 "default"로 처리된다고 합니다. 만약, 기본 서비스를 다른 걸로 지정하고 싶다면 SetDefaultTextCompletionService 메서드를 호출하면 되는데요, 아래의 코드는 위의 예제에서 두 번째 OpenAI 서비스를 default로 지정하고 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > kernelConfig.SetDefaultTextCompletionService("davinci-openai"); </pre> <br /> 아하... 여기서 수수께끼가 하나 풀리는군요. ^^ 지난 글에서 AddOpenAITextCompletionService의 첫 번째 인자가 "Service ID"라고만 설명돼 있어 잘 모르겠다고 했는데 실은 임의의 문자열로 kernelConfig에 추가되는 서비스를 구분하기 위한 식별자로서만 의미가 있었던 것입니다.<br /> <br /> 따라서, 그냥 아무 문자열이나 고유하게만 붙여주면 되는 것입니다. ^^<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
6030
(왼쪽의 숫자를 입력해야 합니다.)