Powered by AppSignal & Oban Pro

Reflexion agent po polsku

polski reflection agent.livemd

Reflexion agent po polsku

Mix.install([
  {:langchain, "~> 0.3.0-rc.0"},
  {:instructor, github: "thmsmlr/instructor_ex"},
  {:gen_state_machine, "~> 3.0"}
])

Section

Application.put_env(:langchain, :openai_key, System.fetch_env!("LB_OPENAI_API_KEY"))
defmodule TwitterInfluencer do
  alias LangChain.ChatModels.ChatOpenAI
  alias LangChain.Chains.LLMChain
  alias LangChain.Message

  def model do
  %{llm: ChatOpenAI.new!(%{model: "gpt-3.5-turbo", verbose: true})}
  end
  def create_reflection_chain do
    model()
    |> LLMChain.new!()
    |> LLMChain.add_messages([
      Message.new_system!(
        "Jesteś wpływowym użytkownikiem Twittera oceniającym tweet. Wygeneruj krytykę" <>
          "i rekomendacje dotyczące tweeta użytkownika. Zawsze dostarczaj szczegółowych" <>
          "rekomendacji, w tym sugestii dotyczących długości, wiralności, stylu itp."
      )
    ])
  end

  def create_generation_chain do
    model()
    |> LLMChain.new!()
    |> LLMChain.add_messages([
      Message.new_system!(
        "Jesteś asystentem wpływowego twórcy treści technologicznych na Twitterze, " <>
          "którego zadaniem jest pisanie doskonałych postów na Twitterze. Wygeneruj " <>
          "najlepszy możliwy post na Twitterze zgodnie z prośbą użytkownika. Jeśli " <>
          "użytkownik dostarczy krytykę, odpowiedz poprawioną wersją swoich " <>
          "poprzednich prób."
      )
    ])
  end

  def generate_tweet(chain, message) when is_binary(message) do
    generate_tweet(chain, Message.new_user!(message))
  end
  def generate_tweet(chain, message) do
    {:ok, updated_chain, response} =
      chain
      |> LLMChain.add_messages([message])
      |> LLMChain.run()

    {response, updated_chain}
  end

  def reflect_on_tweet(chain, message) when is_binary(message) do
    reflect_on_tweet(chain, Message.new_user!(message))
  end
  def reflect_on_tweet(chain, message) do
    {:ok, updated_chain, response} =
      chain
      |> LLMChain.add_messages([message])
      |> LLMChain.run()

    {response, updated_chain}
  end

  def should_continue?(chain) do
    length(chain.messages) < 5
  end

  def run_tweet_improvement_cycle(generate_chain, reflect_chain, initial_request) do
    run_cycle(generate_chain, reflect_chain, initial_request, [])
  end

  defp run_cycle(generate_chain, reflect_chain, input, history) do
    {tweet, updated_generate_chain} = generate_tweet(generate_chain, input)

    if should_continue?(updated_generate_chain) do
      {reflection, _} = reflect_on_tweet(reflect_chain, tweet)

      run_cycle(
        updated_generate_chain,
        reflect_chain,
        "Ulepsz tego tweeta na podstawie następującej krytyki, pisz tylko po polsku: #{reflection}",
        history ++ [tweet, reflection]
      )
    else
      history ++ [tweet]
    end
  end
end
defmodule ExReflection do
  def run(user_request) do
    generate_chain = TwitterInfluencer.create_generation_chain()
    reflect_chain = TwitterInfluencer.create_reflection_chain()


    TwitterInfluencer.run_tweet_improvement_cycle(generate_chain, reflect_chain, user_request)
    |> Enum.with_index()
    |> Enum.each(fn {item, index} ->
      type = if rem(index, 2) == 0, do: "Tweet", else: "Reflection"
      IO.puts("#{type} #{div(index, 2) + 1}: #{item}")
    end)
  end
end
defimpl String.Chars, for: LangChain.Message do
  def to_string(message) do
    message.content
  end
end