인공지능은 나날이 발전하고 있으며, 대규모 언어 모델은 점점 더 강력해지고 있습니다. AI 도구를 활용해 작업 효율성이 대폭 향상됐다. 몇 글자만 입력하고 Tab 키만 누르면 자동으로 코드가 완성된다.
AI를 사용하면 코드 완성 외에도 기능을 자동화하고 필요한 JSON 데이터를 반환할 수 있습니다.
먼저 예를 살펴보겠습니다.
// index.tsinterface Height {meters: number;feet: number;}interface Mountain {name: string;height: Height;}// @ts-ignore// @magicasync function getHighestMountain(): Promise<mountain> {// Return the highest mountain}(async () => {console.log(await getHighestMountain());})();</mountain>
위 코드에서는 세계 최고봉의 정보를 얻기 위해 getHighestMountain 비동기 함수를 정의하고 그 반환 값은 다음과 같이 정의된 데이터 구조입니다. 마운틴 인터페이스. 함수 내부에는 구체적인 구현이 없으며 주석을 통해 함수가 수행해야 하는 작업을 설명할 뿐입니다.
위 코드를 컴파일하고 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
{ name: 'Mount Everest', height: { meters: 8848, feet: 29029 } }
세계에서 가장 높은 산은 히말라야의 주봉이자 세계 최고봉인 에베레스트 산입니다. , 고도가 8848.86 미터로 매우 높지 않습니까?
다음으로 getHighestMountain 함수의 비밀을 공개하겠습니다.
getHighestMountain 비동기 함수 내에서 수행되는 작업을 이해하기 위해 컴파일된 JS 코드를 살펴보겠습니다.
const { fetchCompletion } = require("@jumploops/magic");// @ts-ignore// @magicfunction getHighestMountain() {return __awaiter(this, void 0, void 0, function* () {return yield fetchCompletion("{\n// Return the highest mountain\n}", {schema: "{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"height\":{\"$ref\":\"#/definitions/Height\"}},\"required\":[\"height\",\"name\"],\"definitions\":{\"Height\":{\"type\":\"object\",\"properties\":{\"meters\":{\"type\":\"number\"},\"feet\":{\"type\":\"number\"}},\"required\":[\"feet\",\"meters\"]}},\"$schema\":\"http://json-schema.org/draft-07/schema#\"}"});});}
위 코드에서 볼 수 있듯이 @jumploops/magic의 fetchCompletion 함수는 라이브러리는 getHighestMountain 함수 내에서 사용됩니다.
이 함수의 매개변수에는 이전 TS 함수의 함수 주석도 표시됩니다. 또한 스키마 속성이 포함된 개체도 표시됩니다. 이 속성의 값은 Mountain 인터페이스에 해당하는 JSON Schema 객체입니다.
다음으로 @jumploops/magic 라이브러리의 fetchCompletion 함수를 분석하는 데 중점을 둡니다. 함수는 fetchCompletion.ts 파일에 정의되어 있으며 해당 내부 처리 흐름은 세 단계로 나뉩니다.
// fetchCompletion.tsexport async function fetchCompletion(existingFunction: string, { schema }: { schema: any }) {let completion;// (1)const prompt = `You are a robotic assistant. Your only language is code. You only respond with valid JSON. Nothing but JSON. For example, if you're planning to return:{ "list": [ { "name": "Alice" }, { "name": "Bob" }, { "name": "Carol"}] } Instead just return:[ { "name": "Alice" }, { "name": "Bob" }, { "name": "Carol"}]...Prompt: ${existingFunction.replace('{', '') .replace('}', '').replace('//', '').replace('\n', '')}JSON Schema: \`\`\`${JSON.stringify(JSON.parse(schema), null, 2)}\`\`\``;// (2)try {completion = await openai.createChatCompletion({model: process.env.OPENAI_MODEL ? process.env.OPENAI_MODEL : 'gpt-3.5-turbo',messages: [{ role: 'user', content: prompt }],});} catch (err) {console.error(err);return;}const response = JSON.parse(completion.data.choices[0].message.content);// (3)if (!validateAPIResponse(response, JSON.parse(schema))) {throw new Error("Invalid JSON response from LLM");}return JSON.parse(completion.data.choices[0].message.content);}
Prompt에서는 AI에 대한 역할을 설정하고 유효한 JSON 형식을 반환하도록 안내하는 몇 가지 예시를 준비했습니다.
Chat Completions API를 호출하여 응답 결과를 얻고, openai 라이브러리에서 제공하는 createChatCompletion API를 직접 사용하세요.
응답 결과를 얻은 후 유효성 검사APIResponse 함수가 호출되어 응답 개체를 확인합니다. 이 함수의 구현도 비교적 간단합니다. ajv 라이브러리는 JSON 스키마를 기반으로 개체 확인을 구현하기 위해 내부적으로 사용됩니다.
export function validateAPIResponse(apiResponse: any, schema: object): boolean {const ajvInstance = new Ajv();ajvFormats(ajvInstance);const validate = ajvInstance.compile(schema);const isValid = validate(apiResponse);if (!isValid) {console.log("Validation errors:", validate.errors);}return isValid;}
다음으로 분석하고 싶은 것은 TS 코드를 fetchCompletion 함수를 호출하는 JS 코드로 컴파일하는 방법입니다.
tsconfig.json 파일에서 사용자 정의 변환기를 구성할 수 있게 해주는 @jumploops/magic에서 내부적으로 사용되는 ttypescript 라이브러리입니다.
Transformer 내부에는 typescript에서 제공하는 API가 있는데, AST를 파싱하고 동작시켜 원하는 코드를 생성하는데 사용됩니다. 이 문장은 다음과 같이 다시 작성할 수 있습니다. 변환기 내부의 주요 처리 흐름을 구성하는 세 단계가 있습니다
package.json
{"name": "magic","scripts": {"start": "ttsc && cross-env OPENAI_API_KEY=sk-*** node src/index.js"},"keywords": [],"author": "","license": "ISC","devDependencies": {"@jumploops/magic": "^0.0.6","cross-env": "^7.0.3","ts-patch": "^3.0.0","ttypescript": "^1.5.15","typescript": "4.8.2"}}
tsconfig.json 파일
{"compilerOptions": {"target": "es2016","module": "commonjs","esModuleInterop": true,"allowSyntheticDefaultImports": true,"strict": true,"skipLibCheck": true,"plugins": [{ "transform": "@jumploops/magic" }]},"include": ["src/**/*.ts"],"exclude": [ "node_modules"],}
채팅 완료 API가 항상 예상하는 형식으로 유효한 JSON 개체를 반환하지 않는다는 점에 유의하세요. 실제로는 적절한 예외 처리 논리를 추가해야 합니다.
현재 @jumploops/magic 라이브러리는 함수 매개변수 설정을 지원하지 않으며 간단한 예만 제공합니다. 이 부분에 대해서는 Marvin 라이브러리의 인공지능 기능에 대한 문서를 읽어보실 수 있습니다.
대규모 언어 모델이 요구 사항에 따라 구조화된 데이터를 제어 가능하게 출력할 수 있다면. 우리는 많은 일을 할 수 있습니다.
현재 많은 로우 코드 플랫폼이나 RPA(Robotic Process Automation) 플랫폼은 해당 JSON 스키마 개체를 얻을 수 있습니다.
@jumploops/magic의 솔루션을 사용하면 로우 코드 플랫폼이나 RPA 플랫폼을 더 스마트하게 만들 수 있습니다. 예를 들어 양식 페이지를 빠르게 생성하거나 다양한 작업을 자연어로 게시할 수 있습니다.
마지막으로 TypeScript 변환기를 사용하여 함수의 반환 유형을 가져오고 해당 유형을 JSON 스키마 개체로 변환한 다음 // @magic 주석 본문, 채팅 완료 API를 호출하고 JSON 스키마에 대한 응답의 유효성을 검사합니다.
여러분께 도움이 되길 바라며 오늘 글을 마치겠습니다.
위 내용은 TS가 AI를 만나면 무슨 일이 일어날까요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!