[PYTHON/LANGCHAIN] RunnableSequence 클래스 : 문서 검색 모듈과 질문/답변 생성 모듈 연결하기
■ RunnableSequence 클래스를 사용해 문서 검색 모듈과 질문/답변 생성 모듈을 연결하는 방법을 보여준다. ※ [create_retrieval_chain 함수 : 문서 검색 모듈과 질문/답변 생성
■ RunnableSequence 클래스를 사용해 문서 검색 모듈과 질문/답변 생성 모듈을 연결하는 방법을 보여준다. ※ [create_retrieval_chain 함수 : 문서 검색 모듈과 질문/답변 생성
■ BaseGenerationOutputParser 클래스를 사용해 커스텀 문자열 반전 출력 파서를 만드는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다. ▶ main.py
■ BaseOutputParser 클래스를 사용해 커스텀 논리값 출력 파서를 체인에서 실행하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다. ▶ main.py
■ RunnableGenerator 클래스를 사용해 Iterable 입출력 인자를 갖는 커스텀 함수를 명시적으로 감싸는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다.
■ Iterable 입출력 인자를 갖는 커스텀 함수를 사용해 커스텀 출력 파서 체인에서 스트리밍하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에
■ Iterable 입출력 인자를 갖는 커스텀 함수를 사용해 커스텀 출력 파서를 만드는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다.
■ RunnableLambda 클래스에서 커스텀 함수를 암시적 변환을 통해 커스텀 출력 파서를 만드는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다.
■ OutputFixingParser 클래스를 사용해 파싱 오류 발생시 재시도하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다. ▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
from dotenv import load_dotenv from langchain_core.pydantic_v1 import BaseModel from langchain_core.pydantic_v1 import Field from langchain_core.output_parsers import PydanticOutputParser from langchain_core.prompts import PromptTemplate from langchain_openai import OpenAI from langchain.output_parsers import OutputFixingParser from langchain_core.runnables import RunnableParallel from langchain_core.runnables import RunnableLambda load_dotenv() class Action(BaseModel): action : str = Field(description = "action to take" ) action_input : str = Field(description = "input to the action") pydanticOutputParser = PydanticOutputParser(pydantic_object = Action) promptTemplate = PromptTemplate( template = "Answer the user query.\n{format_instructions}\n{query}\n", input_variables = ["query"], partial_variables = {"format_instructions": pydanticOutputParser.get_format_instructions()} ) openAI = OpenAI(temperature = 0) completionRunnableSequence = promptTemplate | openAI outputFixingParser = OutputFixingParser.from_llm(parser = pydanticOutputParser, llm = openAI) executeRunnableSequence = RunnableParallel(completion = completionRunnableSequence, prompt_value = promptTemplate) \ | RunnableLambda(lambda x : outputFixingParser.parse_with_prompt(**x)) action = executeRunnableSequence.invoke({"query" : "who is leo di caprios gf?"}) print(action) """ action='search' action_input='leo di caprios gf' """ |
▶
■ RetryOutputParser 클래스를 사용해 파싱 오류 발생시 모델을 다시 실행해 새로운 출력을 얻어 재시도하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env
■ YamlOutputParser 클래스를 사용해 체인에서 구조화된 데이터를 구하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다. ▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
from dotenv import load_dotenv from langchain_core.pydantic_v1 import BaseModel from langchain_core.pydantic_v1 import Field from langchain.output_parsers import YamlOutputParser from langchain_core.prompts import PromptTemplate from langchain_openai import ChatOpenAI load_dotenv() class Joke(BaseModel): setup : str = Field(description = "question to set up a joke" ) punchline : str = Field(description = "answer to resolve the joke") yamlOutputParser = YamlOutputParser(pydantic_object = Joke) promptTemplate = PromptTemplate( template = "Answer the user query.\n{format_instructions}\n{query}\n", input_variables = ["query"], partial_variables = {"format_instructions" : yamlOutputParser.get_format_instructions()} ) chatOpenAI = ChatOpenAI(temperature = 0) runnableSequence = promptTemplate | chatOpenAI | yamlOutputParser joke = runnableSequence.invoke({"query" : "Tell me a joke."}) print(joke) """ setup="Why couldn't the bicycle find its way home?" punchline='Because it lost its bearings!' """ |
▶
■ XMLOutputParser 클래스를 사용해 체인에서 구조화된 데이터를 구하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다. ▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
from dotenv import load_dotenv from langchain_core.prompts import PromptTemplate from langchain_openai import OpenAI from langchain_core.output_parsers import XMLOutputParser load_dotenv() xmlOutputParser = XMLOutputParser() promptTemplate = PromptTemplate( template = "{query}\n{format_instructions}", input_variables = ["query"], partial_variables = {"format_instructions" : xmlOutputParser.get_format_instructions()}, ) openAI = OpenAI(temperature = 0.0, max_tokens = 512) runnableSequence = promptTemplate | openAI | xmlOutputParser responseDictionary = runnableSequence.invoke({"query" : "Generate the shortened filmography for Tom Hanks."}) print(responseDictionary) """ {'filmography': [{'film': [{'title': 'Forrest Gump'}, {'year': '1994'}]}, {'film': [{'title': 'Cast Away'}, {'year': '2000'}]}, {'film': [{'title': 'Saving Private Ryan'}, {'year': '1998'}]}, {'film': [{'title': 'Apollo 13'}, {'year': '1995'}]}, {'film': [{'title': 'The Green Mile'}, {'year': '1999'}]}, {'film': [{'title': 'Toy Story'}, {'year': '1995'}]}, {'film': [{'title': 'Toy Story 2'}, {'year': '1999'}]}, {'film': [{'title': 'Toy Story 3'}, {'year': '2010'}]}, {'film': [{'title': 'Philadelphia'}, {'year': '1993'}]}, {'film': [{'title': 'Big'}, {'year': '1988'}]}]} """ |
▶
■ JsonOutputParser 클래스의 생성자에서 pydantic_object 인자 지정없이 체인에서 구조화된 데이터를 구하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다. ▶
■ JsonOutputParser 클래스를 사용해 체인에서 구조화된 데이터를 구하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다. ▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
from dotenv import load_dotenv from langchain_core.pydantic_v1 import BaseModel from langchain_core.pydantic_v1 import Field from langchain_core.prompts import PromptTemplate from langchain_openai import OpenAI from langchain_core.output_parsers import JsonOutputParser load_dotenv() class Joke(BaseModel): setup : str = Field(description = "question to set up a joke" ) punchline : str = Field(description = "answer to resolve the joke") jsonOutputParser = JsonOutputParser(pydantic_object = Joke) promptTemplate = PromptTemplate( template = "Answer the user query.\n{format_instructions}\n{query}\n", input_variables = ["query"], partial_variables = {"format_instructions" : jsonOutputParser.get_format_instructions()}, ) openAI = OpenAI(model_name = "gpt-3.5-turbo-instruct", temperature = 0.0) runnableSequence = promptTemplate | openAI | jsonOutputParser responseDictionary = runnableSequence.invoke({"query" : "Tell me a joke."}) print(responseDictionary) """ {'setup' : 'Why did the tomato turn red?', 'punchline' : 'Because it saw the salad dressing!'} """ |
▶
■ SimpleJsonOutputParser 클래스를 사용해 체인에서 구조화된 데이터를 구하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다. ▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
from dotenv import load_dotenv from langchain_core.prompts import PromptTemplate from langchain_openai import OpenAI from langchain.output_parsers.json import SimpleJsonOutputParser load_dotenv() promptTemplat = PromptTemplate.from_template( "Return a JSON object with an `answer` key that answers the following question : {question}" ) openAI = OpenAI(model_name = "gpt-3.5-turbo-instruct", temperature = 0.0) runnableSequence = promptTemplat | openAI | SimpleJsonOutputParser() responseDictionary = runnableSequence.invoke({"question" : "Who invented the microscope?"}) print(responseDictionary) """ {'answer': 'Antonie van Leeuwenhoek'} """ |
▶
■ PydanticOutputParser 클래스를 체인에서 사용해 구조화된 데이터를 구하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다. ▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
from dotenv import load_dotenv from langchain_core.pydantic_v1 import BaseModel from langchain_core.pydantic_v1 import Field from langchain_core.pydantic_v1 import validator from langchain_core.prompts import PromptTemplate from langchain_openai import OpenAI from langchain_core.output_parsers import PydanticOutputParser load_dotenv() class Joke(BaseModel): setup : str = Field(description = "question to set up a joke" ) punchline : str = Field(description = "answer to resolve the joke") @validator("setup") def valiedateSetup(cls, field): if field[-1] != "?": raise ValueError("Badly formed question!") return field pydanticOutputParser = PydanticOutputParser(pydantic_object = Joke) promptTemplate = PromptTemplate( template = "Answer the user query.\n{format_instructions}\n{query}\n", input_variables = ["query"], partial_variables = {"format_instructions" : pydanticOutputParser.get_format_instructions()}, ) openAI = OpenAI(model_name = "gpt-3.5-turbo-instruct", temperature = 0.0) runnableSequence = promptTemplate | openAI | pydanticOutputParser joke = runnableSequence.invoke({"query" : "Tell me a joke."}) print(joke) """ setup='Why did the tomato turn red?' punchline='Because it saw the salad dressing!' """ |
▶
■ PydanticOutputParser 클래스의 invoke 메소드를 사용해 객체를 구하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다. ▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
from dotenv import load_dotenv from langchain_core.pydantic_v1 import BaseModel from langchain_core.pydantic_v1 import Field from langchain_core.pydantic_v1 import validator from langchain_core.prompts import PromptTemplate from langchain_openai import OpenAI from langchain_core.output_parsers import PydanticOutputParser load_dotenv() class Joke(BaseModel): setup : str = Field(description = "question to set up a joke" ) punchline : str = Field(description = "answer to resolve the joke") # Pydantic을 사용하면 사용자 정의 검증 논리를 쉽게 추가할 수 있습니다. @validator("setup") def valiedateSetup(cls, field): if field[-1] != "?": raise ValueError("Badly formed question!") return field # 파서를 설정하고 프롬프트 템플릿에 지침을 삽입한다. pydanticOutputParser = PydanticOutputParser(pydantic_object = Joke) promptTemplate = PromptTemplate( template = "Answer the user query.\n{format_instructions}\n{query}\n", input_variables = ["query"], partial_variables = {"format_instructions" : pydanticOutputParser.get_format_instructions()}, ) openAI = OpenAI(model_name = "gpt-3.5-turbo-instruct", temperature = 0.0) # 그리고 데이터 구조를 채우도록 언어 모델을 프롬프트하기 위한 쿼리이다. runnableSequence = promptTemplate | openAI responseDictionary = runnableSequence.invoke({"query" : "Tell me a joke."}) print(responseDictionary) """ { "setup" : "Why did the tomato turn red?", "punchline" : "Because it saw the salad dressing!" } """ joke = pydanticOutputParser.invoke(responseDictionary) print(joke) """ setup='Why did the tomato turn red?' punchline='Because it saw the salad dressing!' """ |
▶
■ get_openai_callback 함수 : 단일 채팅 모델에서 스트리밍시 토큰 사용량 구하기 ※ 비용을 측정할 수 없다. ※ OPENAI_API_KEY 환경 변수 값은 .env
■ get_openai_callback 함수를 사용해 체인에서 복수 호출시 토큰 사용량을 구하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다. ▶ main.py
■ get_openai_callback 함수를 사용해 단일 채팅 모델에서 단일 호출시 토큰 사용량을 구하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다.
■ OpenAI 클래스의 astream_events 메소드를 사용해 비동기 스트리밍 이벤트를 수신하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다. ▶ main.py
■ OpenAI 클래스의 astream 메소드를 사용해 질의 응답을 비동기 스트리밍하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다. ▶ main.py
■ OpenAI 클래스의 stream 메소드를 사용해 질의 응답을 스트리밍하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다. ▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from dotenv import load_dotenv from langchain_openai import OpenAI load_dotenv() openAI = OpenAI(model = "gpt-3.5-turbo-instruct", temperature = 0, max_tokens = 512) for chunkString in openAI.stream("Write me a 1 verse song about sparkling water."): print(chunkString, end = "", flush = True) """ Sparkling water, oh so clear Bubbles dancing, without fear Refreshing taste, a pure delight """ |
■ set_llm_cache 함수에서 SQLiteCache 객체를 사용해 SQLITE 데이터베이스 파일 캐시를 설정하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다. ▶
■ set_llm_cache 함수에서 InMemoryCache 객체를 설정해 메모리 캐시를 사용하는 방법을 보여준다. ※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다. ▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
from dotenv import load_dotenv from langchain_community.cache import InMemoryCache from langchain.globals import set_llm_cache from langchain_openai import OpenAI load_dotenv() set_llm_cache(InMemoryCache()) openAI = OpenAI(model_name = "gpt-3.5-turbo-instruct", n = 2, best_of = 2) responseString = openAI.invoke("Tell me a joke") print(responseString) """ Why did the tomato turn red? Because it saw the salad dressing! """ responseString = openAI.invoke("Tell me a joke") print(responseString) """ Why did the tomato turn red? Because it saw the salad dressing! """ |
■ get_openai_callback 함수를 사용해 에이전트에서 토큰 사용량을 구하는 방법을 보여준다. ※ 비용 정보에 대해 AgentExecutor 클래스 생성자에서 stream_runnable = False를 설정해야 한다.