Проблема с введением параметров при вызовах инструментов в агенте LangChainPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Проблема с введением параметров при вызовах инструментов в агенте LangChain

Сообщение Anonymous »

Я столкнулся с проблемой внедрения параметров при использовании агента LangChain для вызова инструмента. Несмотря на то, что внедрение параметров, судя по сообщению AI, которое я печатаю, кажется успешным, вызов инструмента агента в конечном итоге получает пустые параметры, как если бы он все еще использовал исходное (пустое) сообщение вместо обновленного с введенными параметрами.Я использую следующую структуру кода для динамического внедрения параметров в api_tool. Соответствующие фрагменты кода следующие:

Код: Выделить всё

class APIToolInput(BaseModel):
swagger_file: Annotated[str, InjectedToolArg] = Field(..., description="The URL or file path to the OpenAPI (swagger) specification file, which describes the API's structure.")
method: Annotated[str, InjectedToolArg] = Field(..., description="The HTTP method to use for the API call.")
endpoint: Annotated[str, InjectedToolArg] = Field(..., description="The endpoint path to use for the API call.")
params: Optional[dict] = Field(description="A dictionary of query parameters to include in the API request.", default={})
headers: Optional[dict] = Field(description="A dictionary of headers to include in the API request.", default={})

@tool(parse_docstring=False, args_schema=APIToolInput)
def api_tool(swagger_file: Annotated[str, InjectedToolArg],
method: Annotated[str, InjectedToolArg],
endpoint: Annotated[str, InjectedToolArg],
params: Optional[dict] = {},
headers: Optional[dict] = {}) -> dict:
spec = OpenAPISpec.from_url(swagger_file)
url = spec.base_url
full_url = f"{url}{endpoint}"
try:
response_api = requests.request(
method=method,
url=full_url,
params=params,
headers=headers
)
except Exception as e:
return {"error": f"Failed to call API: {str(e)}"}

if response_api.status_code != 200:
return {"error": f"Failed to call API: {response_api.text}"}

return response_api.json()

@chain
def inject_parameters(ai_msg, **kwargs):
new_ai_msg = deepcopy(ai_msg)
# Inject parameters into additional_kwargs
for tool_call in new_ai_msg.additional_kwargs['tool_calls']:
arguments = "{" + ",".join([f'"{key}":"{value}"' for key, value in kwargs.items()]) + "}"
tool_call['function']['arguments'] = arguments

# Inject parameters into each tool call parameter
for tool_call in new_ai_msg.tool_calls:
tool_call["args"].update(kwargs)

return new_ai_msg
Настройка агента и рабочего процесса включает в себя введение параметров во время условного шага (should_continue) рабочего процесса langgraph. Вот как я вызываю агент и ввожу параметры:

Код: Выделить всё

def call_agent(state: State) -> State:
messages = state['messages']
response = agent.invoke(messages)
state["messages"] = [response]
return state

def should_continue(state: State) -> Literal["tools", END]:
messages = state['messages']
last_message = messages[-1]
if last_message.tool_calls:
new_ai_msg = inject_parameters.invoke(
last_message,
swagger_file=state["intermediate_steps"]["api_selection"]["swagger_file"],
method=state["intermediate_steps"]["api_selection"]["http_method"],
endpoint=state["intermediate_steps"]["api_selection"]["endpoint_path"]
)
state['messages'][-1] = new_ai_msg
return "tools"
return END
workflow.add_edge(START, "preprocess_query")
workflow.add_edge("preprocess_query", "decision")
workflow.add_conditional_edges(source="decision", path=route_tools, path_map={"llm": "llm", "graph_rag": "graph_rag"})
workflow.add_edge("graph_rag", "format_rag_results")
workflow.add_edge("format_rag_results", "select_api")
workflow.add_edge("select_api", "agent")
workflow.add_conditional_edges(source="agent", path=should_continue)
workflow.add_edge("tools", 'agent')
workflow.add_edge("llm", END)

checkpointer = MemorySaver()
app = workflow.compile(checkpointer=checkpointer)
После ввода параметров напечатанное сообщение AI показывает правильность введенных параметров:

Код: Выделить всё

[HumanMessage(content='What are the current bitcoin price?'), AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_KNwEt72ii9HJJkr3hRm7dQRG', 'function': {'arguments': '{"swagger_file":"https://api.apis.guru/v2/specs/interzoid.com/getcurrencyrate/1.0.0/openapi.json","method":"get","endpoint":"/getcurrencyrate"}', 'name': 'api_tool'}, 'type': 'function'}]}, tool_calls=[{'name': 'api_tool', 'args': {'swagger_file': 'https://api.apis.guru/v2/specs/interzoid.com/getcurrencyrate/1.0.0/openapi.json', 'method': 'get', 'endpoint': '/getcurrencyrate'}}])]
Однако в трассировке Лангсмита вызов инструмента отображается пустым, что приводит к следующей ошибке:

Код: Выделить всё

ValidationError(model='APIToolInput', errors=[{'loc': ('swagger_file',), 'msg': 'field required', 'type': 'value_error.missing'}, {'loc': ('method',), 'msg': 'field required', 'type': 'value_error.missing'}, {'loc': ('endpoint',), 'msg': 'field required', 'type': 'value_error.missing'}])
Почему в печатном выводе внедрение параметров отображается как успешное, но во время выполнения вызова инструмента параметры по-прежнему остаются пустыми? Я что-то упускаю из того, как вызов инструмента обрабатывает введенные параметры, или может быть проблема с обработкой Langsmith обновленных сообщений?

Подробнее здесь: https://stackoverflow.com/questions/791 ... hain-agent
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как получить доступ к состоянию от Langgraph внутри инструмента в агенте React или инструментальном агенте Openai?
    Anonymous » » в форуме Python
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Infinite Loop в пользовательском агенте React с использованием Langchain, [отсутствует »действие:« После «мысли:»]
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Проблема с введением данных Python
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Проблема с введением данных Python
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Инициатор Spring Boot Mocks перед введением их
    Anonymous » » в форуме JAVA
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»