update
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
# Tool Use Example - MCTS with External Tools
|
||||
|
||||
This example shows how MCTS can coordinate with external tools (like APIs, databases, or other services).
|
||||
|
||||
```julia
|
||||
using LLMMCTS
|
||||
|
||||
# Simulated tool interface
|
||||
struct Tool
|
||||
name::String
|
||||
description::String
|
||||
end
|
||||
|
||||
const AVAILABLE_TOOLS = [
|
||||
Tool("calculator", "Perform mathematical calculations"),
|
||||
Tool("web_search", "Search the web for information"),
|
||||
Tool("database_query", "Query a database")
|
||||
]
|
||||
|
||||
# State tracks which tools have been used and their results
|
||||
function tool_use_transition(state::Dict, args::NamedTuple)
|
||||
current_step = get(state, :step, 0)
|
||||
tools_used = get(state, :tools_used, String[])
|
||||
|
||||
# LLM would decide which tool to use
|
||||
# For this example, we try tools in order
|
||||
tool_idx = (current_step - 1) % length(AVAILABLE_TOOLS) + 1
|
||||
|
||||
if tool_idx > length(AVAILABLE_TOOLS)
|
||||
# All tools tried, return terminal state
|
||||
newstate = Dict(
|
||||
:step => current_step + 1,
|
||||
:tools_used => tools_used,
|
||||
:reward => 8.0,
|
||||
:isterminal => true
|
||||
)
|
||||
return Dict(
|
||||
:newNodeKey => "all_tools_tried",
|
||||
:newstate => newstate,
|
||||
:progressvalue => 8.0
|
||||
)
|
||||
end
|
||||
|
||||
tool = AVAILABLE_TOOLS[tool_idx]
|
||||
|
||||
# Simulate tool execution
|
||||
tool_result = "Tool '$(tool.name)' executed successfully"
|
||||
|
||||
# Calculate reward based on progress
|
||||
progress = length(tools_used) / length(AVAILABLE_TOOLS)
|
||||
reward = progress * 5
|
||||
|
||||
# Progress value: LLM estimates how close we are to solving
|
||||
progressvalue = progress * 10
|
||||
|
||||
new_tools_used = vcat(tools_used, tool.name)
|
||||
|
||||
newstate = Dict(
|
||||
:step => current_step + 1,
|
||||
:tools_used => new_tools_used,
|
||||
:current_tool => tool.name,
|
||||
:tool_result => tool_result,
|
||||
:reward => reward,
|
||||
:isterminal => false
|
||||
)
|
||||
|
||||
return Dict(
|
||||
:newNodeKey => "tool_$(tool.name)_$current_step",
|
||||
:newstate => newstate,
|
||||
:progressvalue => progressvalue
|
||||
)
|
||||
end
|
||||
|
||||
# Initial state
|
||||
initialstate = Dict(
|
||||
:step => 0,
|
||||
:tools_used => String[],
|
||||
:reward => 0,
|
||||
:isterminal => false
|
||||
)
|
||||
|
||||
# Transition arguments
|
||||
transitionargs = (max_tools = 3,)
|
||||
|
||||
# Run MCTS
|
||||
result = runMCTS(
|
||||
initialstate,
|
||||
tool_use_transition,
|
||||
transitionargs;
|
||||
maxiterations = 20,
|
||||
explorationweight = 1.2,
|
||||
maxSimulationDepth = 4,
|
||||
horizontalSampleExpansionPhase = 3
|
||||
)
|
||||
|
||||
# Display results
|
||||
println("Available tools:")
|
||||
for tool in AVAILABLE_TOOLS
|
||||
println(" - $(tool.name): $(tool.description)")
|
||||
end
|
||||
println()
|
||||
println("Best tool usage sequence:")
|
||||
for tool in result.bestTerminalState[:tools_used]
|
||||
println(" → Used: $tool")
|
||||
end
|
||||
println()
|
||||
println("Root node visits: ", result.root.visits)
|
||||
println("High value states found: ", length(result.highValueStateList))
|
||||
```
|
||||
Reference in New Issue
Block a user