■ 모델에서 임시 도구 호출 기능을 추가하는 방법을 보여준다.
※ 도구 출력뿐만 아니라 도구 입력도 반환하는 것이 도움이 될 수 있다.
※ RunnablePassthrough 클래스의 assign 메소드를 사용해 도구 출력을 사용하여 LCEL로 쉽게 이를 수행할 수 있다.
※ 이렇게 하면 RunnablePassrthrough 구성 요소에 대한 입력이 무엇이든(사전으로 가정) 키를 추가하고 현재 입력에 있는 모든 것을 계속 전달한다.
▶ 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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
from langchain_core.tools import tool from langchain_core.tools import render_text_description from langchain_core.prompts import ChatPromptTemplate from langchain_community.llms import Ollama from langchain_core.output_parsers import JsonOutputParser from typing import TypedDict from typing import Dict from typing import Any from typing import Optional from langchain_core.runnables import RunnableConfig from langchain_core.runnables import RunnablePassthrough @tool def multiply(x : float, y : float) -> float: """Multiply two numbers together.""" return x * y @tool def add(x : int, y : int) -> int: "Add two numbers." return x + y toolList = [multiply, add] toolListTextDescription = render_text_description(toolList) systemPromptTemplateString = f"""\ You are an assistant that has access to the following set of tools. Here are the names and descriptions for each tool: {toolListTextDescription} Given the user input, return the name and input of the tool to use. Return your response as a JSON blob with 'name' and 'argumentDictionary' keys. The `argumentDictionary` should be a dictionary, with keys corresponding to the argument names and the values corresponding to the requested values. """ chatPromptTemplate = ChatPromptTemplate.from_messages( [ ("system", systemPromptTemplateString), ("user" , "{input}") ] ) ollama = Ollama(model = "phi3:latest") jsonOutputParser = JsonOutputParser() class ToolCallRequest(TypedDict): """A typed dict that shows the inputs into the invoke_tool function.""" name : str argumentDictionary : Dict[str, Any] def invokeTool(toolCallRequest : ToolCallRequest, runnableConfig : Optional[RunnableConfig] = None): """A function that we can use the perform a tool invocation. Args : toolCallRequest : a dict that contains the keys name and arguments. The name must match the name of a tool that exists. The argumentDictionary are the arguments to that tool. runnableConfig : This is configuration information that LangChain uses that contains things like callbacks, metadata, etc.See LCEL documentation about RunnableConfig. Returns : output from the requested tool """ toolNameDictionary = {tool.name : tool for tool in toolList} name = toolCallRequest["name"] tool = toolNameDictionary[name] return tool.invoke(toolCallRequest["argumentDictionary"], config = runnableConfig) runnableSequence = chatPromptTemplate | ollama | jsonOutputParser | RunnablePassthrough.assign(output = invokeTool) responseDictionary = runnableSequence.invoke({"input" : "what's thirteen times 4.14137281"}) print(responseDictionary) """ {'name': 'multiply', 'argumentDictionary': {'x': 13, 'y': 4.14137281}, 'output': 53.83784653} """ |
▶ requirements.txt
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 |
aiohappyeyeballs==2.4.3 aiohttp==3.10.8 aiosignal==1.3.1 annotated-types==0.7.0 anyio==4.6.0 attrs==24.2.0 certifi==2024.8.30 charset-normalizer==3.3.2 dataclasses-json==0.6.7 frozenlist==1.4.1 greenlet==3.1.1 h11==0.14.0 httpcore==1.0.6 httpx==0.27.2 idna==3.10 jsonpatch==1.33 jsonpointer==3.0.0 langchain==0.3.1 langchain-community==0.3.1 langchain-core==0.3.8 langchain-text-splitters==0.3.0 langsmith==0.1.130 marshmallow==3.22.0 multidict==6.1.0 mypy-extensions==1.0.0 numpy==1.26.4 orjson==3.10.7 packaging==24.1 pydantic==2.9.2 pydantic-settings==2.5.2 pydantic_core==2.23.4 python-dotenv==1.0.1 PyYAML==6.0.2 requests==2.32.3 requests-toolbelt==1.0.0 sniffio==1.3.1 SQLAlchemy==2.0.35 tenacity==8.5.0 typing-inspect==0.9.0 typing_extensions==4.12.2 urllib3==2.2.3 yarl==1.13.1 |
※ pip install langchain langchain-community 명령을 실행했다.