[](https://hamel.dev/blog/posts/prompt/#cb8-1)import guidance [](https://hamel.dev/blog/posts/prompt/#cb8-2)gpt35 = guidance.models.OpenAI("gpt-3.5-turbo") [](https://hamel.dev/blog/posts/prompt/#cb8-3) [](https://hamel.dev/blog/posts/prompt/#cb8-4)import re [](https://hamel.dev/blog/posts/prompt/#cb8-5)from guidance import gen, select, system, user, assistant [](https://hamel.dev/blog/posts/prompt/#cb8-6) [](https://hamel.dev/blog/posts/prompt/#cb8-7)@guidance [](https://hamel.dev/blog/posts/prompt/#cb8-8)def plan_for_goal(lm, goal: str): [](https://hamel.dev/blog/posts/prompt/#cb8-9) [](https://hamel.dev/blog/posts/prompt/#cb8-10) # This is a helper function which we will use below [](https://hamel.dev/blog/posts/prompt/#cb8-11) def parse_best(prosandcons, options): [](https://hamel.dev/blog/posts/prompt/#cb8-12) best = re.search(r'Best=(\d+)', prosandcons) [](https://hamel.dev/blog/posts/prompt/#cb8-13) if not best: [](https://hamel.dev/blog/posts/prompt/#cb8-14) best = re.search(r'Best.*?(\d+)', 'Best= option is 3') [](https://hamel.dev/blog/posts/prompt/#cb8-15) if best: [](https://hamel.dev/blog/posts/prompt/#cb8-16) best = int(best.group(1)) [](https://hamel.dev/blog/posts/prompt/#cb8-17) else: [](https://hamel.dev/blog/posts/prompt/#cb8-18) best = 0 [](https://hamel.dev/blog/posts/prompt/#cb8-19) return options[best] [](https://hamel.dev/blog/posts/prompt/#cb8-20) [](https://hamel.dev/blog/posts/prompt/#cb8-21) # Some general instruction to the model [](https://hamel.dev/blog/posts/prompt/#cb8-22) with system(): [](https://hamel.dev/blog/posts/prompt/#cb8-23) lm += "You are a helpful assistant." [](https://hamel.dev/blog/posts/prompt/#cb8-24) [](https://hamel.dev/blog/posts/prompt/#cb8-25) # Simulate a simple request from the user [](https://hamel.dev/blog/posts/prompt/#cb8-26) # Note that we switch to using 'lm2' here, because these are intermediate steps (so we don't want to overwrite the current lm object) [](https://hamel.dev/blog/posts/prompt/#cb8-27) with user(): [](https://hamel.dev/blog/posts/prompt/#cb8-28) lm2 = lm + f"""\ [](https://hamel.dev/blog/posts/prompt/#cb8-29) I want to {goal} [](https://hamel.dev/blog/posts/prompt/#cb8-30) Can you please generate one option for how to accomplish this? [](https://hamel.dev/blog/posts/prompt/#cb8-31) Please make the option very short, at most one line.""" [](https://hamel.dev/blog/posts/prompt/#cb8-32) [](https://hamel.dev/blog/posts/prompt/#cb8-33) # Generate several options. Note that this means several sequential generation requests [](https://hamel.dev/blog/posts/prompt/#cb8-34) n_options = 5 [](https://hamel.dev/blog/posts/prompt/#cb8-35) with assistant(): [](https://hamel.dev/blog/posts/prompt/#cb8-36) options = [] [](https://hamel.dev/blog/posts/prompt/#cb8-37) for i in range(n_options): [](https://hamel.dev/blog/posts/prompt/#cb8-38) options.append((lm2 + gen(name='option', temperature=1.0, max_tokens=50))["option"]) [](https://hamel.dev/blog/posts/prompt/#cb8-39) [](https://hamel.dev/blog/posts/prompt/#cb8-40) # Have the user request pros and cons [](https://hamel.dev/blog/posts/prompt/#cb8-41) with user(): [](https://hamel.dev/blog/posts/prompt/#cb8-42) lm2 += f"""\ [](https://hamel.dev/blog/posts/prompt/#cb8-43) I want to {goal} [](https://hamel.dev/blog/posts/prompt/#cb8-44) Can you please comment on the pros and cons of each of the following options, and then pick the best option? [](https://hamel.dev/blog/posts/prompt/#cb8-45) --- [](https://hamel.dev/blog/posts/prompt/#cb8-46) """ [](https://hamel.dev/blog/posts/prompt/#cb8-47) for i, opt in enumerate(options): [](https://hamel.dev/blog/posts/prompt/#cb8-48) lm2 += f"Option {i}: {opt}\n" [](https://hamel.dev/blog/posts/prompt/#cb8-49) lm2 += f"""\ [](https://hamel.dev/blog/posts/prompt/#cb8-50) --- [](https://hamel.dev/blog/posts/prompt/#cb8-51) Please discuss each option very briefly (one line for pros, one for cons), and end by saying Best=X, where X is the number of the best option.""" [](https://hamel.dev/blog/posts/prompt/#cb8-52) [](https://hamel.dev/blog/posts/prompt/#cb8-53) # Get the pros and cons from the model [](https://hamel.dev/blog/posts/prompt/#cb8-54) with assistant(): [](https://hamel.dev/blog/posts/prompt/#cb8-55) lm2 += gen(name='prosandcons', temperature=0.0, max_tokens=600, stop="Best=") + "Best=" + gen("best", regex="[0-9]+") [](https://hamel.dev/blog/posts/prompt/#cb8-56) [](https://hamel.dev/blog/posts/prompt/#cb8-57) # The user now extracts the one selected as the best, and asks for a full plan [](https://hamel.dev/blog/posts/prompt/#cb8-58) # We switch back to 'lm' because this is the final result we want [](https://hamel.dev/blog/posts/prompt/#cb8-59) with user(): [](https://hamel.dev/blog/posts/prompt/#cb8-60) lm += f"""\ [](https://hamel.dev/blog/posts/prompt/#cb8-61) I want to {goal} [](https://hamel.dev/blog/posts/prompt/#cb8-62) Here is my plan: {options[int(lm2["best"])]} [](https://hamel.dev/blog/posts/prompt/#cb8-63) Please elaborate on this plan, and tell me how to best accomplish it.""" [](https://hamel.dev/blog/posts/prompt/#cb8-64) [](https://hamel.dev/blog/posts/prompt/#cb8-65) # The plan is generated [](https://hamel.dev/blog/posts/prompt/#cb8-66) with assistant(): [](https://hamel.dev/blog/posts/prompt/#cb8-67) lm += gen(name='plan', max_tokens=500) [](https://hamel.dev/blog/posts/prompt/#cb8-68) [](https://hamel.dev/blog/posts/prompt/#cb8-69) return lm