Dishen Wang · Seuraa
Julkaistu · 6 min lukeminen · 21. kesäkuuta
--
Johdanto
Meidän viimeisessäblogipostauskeskustelimme aiheesta PostGres-tietokannan yhdistäminen Large Language Model (LLM) -järjestelmään ja annoimme esimerkin sen käytöstäLangChain SQLChainmuodostaaksesi yhteyden tietokantaan ja kysyäksesi kysymyksiä. Tässä viestissä teemme saman kanssa aLangChain SQLAgentja vertaa näiden kahden lähestymistavan tehokkuutta.
Miksi SQLAgent
Ennen kuin siirryt opetusohjelmaan, meidän on ensin ymmärrettävä, mikä on agentti ja miksi sitä voidaan suosia yksinkertaiseen SQLChainiin verrattuna. Agentti on komponentti, jolla on pääsy työkaluihin, mukaan lukien Large Language Model (LLM). Sen erottuva ominaisuus on kyky tehdä tietoisia päätöksiä käyttäjän syötteen perusteella käyttäen sopivia työkaluja, kunnes se saa tyydyttävän vastauksen. Esimerkiksi tekstistä SQL:ksi siirrettäessä LangChain SQLAgent ei anna periksi, jos generoidun SQL:n suorittamisessa tapahtuu virhe. Sen sijaan se yrittää toipua tulkitsemalla virheen seuraavassa LLM-kutsussa ja korjaa ongelman. Siksi teoriassa SQLAgentin pitäisi olla parempi kuin SQLChain tuottavuudessa ja tarkkuudessa.
Katsotaanpa, kuinka SQLAgent toimii meitä vastaanKiinteistöt
tietokanta.
1. Aloitus
Jos luet ensimmäistä blogiamme osoitteessakuinka käyttää LangChain SQLChainia LLM:n yhdistämiseen tietokantaan, saatat jo tuntea jotkin alla olevista vaiheista. Voit vapaasti hypätä ympäriinsä ja noudattaa ohjeita tarpeen mukaan.
Tässä opetusohjelmassa käytämme OpenAI:tagpt-3.5-turbo
malli LLM-mallillemme ja DataheraldilleKiinteistöt
tietokantaamme varten. Tässä opetusohjelmassa käytetään postgresia sql-murteena. Jos käytät toista sql-murretta, tarkistaSQLAlchemyohjeet tietokantayhteyden määrittämisestä.
Asennamme ensin tarvittavat paketit. Jos kyseessä on postgres, varmista, että olet asentanut postgreSQL:n koneellesi. Hyödynnä OpenAI:n API:ta varmistamalla, että sinulla on OpenAI-tili ja sen API-avain valmiina.
Asenna seuraavat paketit:
pip asennus langchain
pip install openai
pip asennus psycopg2
Luo seuraavaksi python-tiedosto nimeltämain.py
ja tuo seuraavat:
langchain.agentsista tuo create_sql_agent
Tuo SQLDatabaseToolkit osoitteesta langchain.agents.agent_toolkits
langchain.sql_database tuo SQLDatabase
Tuo OpenAI osoitteesta langchain.llms.openai
langchain.agentsista tuonti AgentExecutor
langchain.agents.agent_typesista tuo AgentType
langchain.chat_modelsista tuo ChatOpenAI
2. Yhdistä tietokanta
Käytä Postgres-tietokantoja varten seuraavaa muotomerkkijonoa tietokannan URI:lle ja ilmoita vaaditut muuttujat yllä:
pg_uri = f"postgresql+psycopg2://{username}:{password}@{host}:{port}/{mydatabase}"
Asetetaan nyt tietokantayhteytemme:
db = SQLDatabase.from_uri(pg_uri)
3. Asenna LLM
Koska käytämme OpenAI:tagpt-3.5-turbo
mallia, anna meidän käyttää OpenAI-tilimme API-avainta:
OPENAI_API_KEY = "OpenAI-avaimesi"
Määritellään LLM-mallimme:
gpt = OpenAI(lämpötila=0, openai_api_key=OPENAI_API_KEY, mallin_nimi='gpt-3.5-turbo')
4. Asetusagentti
Määrittelemme agenttimme työkalupakki, jota käytetään vastaamaan käyttäjän kysymykseen:
työkalupakki = SQLDatabaseToolkit(db=db, llm=gpt)
Sitten voimme luoda agenttitoimitsijamme agenttityypilläZERO_SHOT_REACT_DESCRIPTION
:
agent_executor = create_sql_agent(
llm=gpt,
työkalupakki = työkalupakki,
verbose = Totta,
agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
)
Lisätietoja käytettävissä olevista agenttityypeistä ja niiden ominaisuuksista on LangChainin dokumentaatiossatässä.
5. Esitä kysely
Lopuksi määritellään kysymys ja suoritetaan agentti kysymyksellä:
kysymys = "Keskimääräinen vuokra Chicagossa lokakuusta 2022 joulukuuhun 2022"
agent_executor.run(kysymys)
Tässä tulokset ohjelmamme suorittamisen jälkeen:
> Siirrytään uuteen ketjuun...
Toimi: sql_db_list_tables
Toiminnon syöttö: ""
Havainto: redfin_homes_sold, zillow_home_value_index, redfin_median_list_price, redfin_median_ppsf, renthub_neighborhood_listings, zillow_observed_rent_index, zillow_rent, redfin_avg_sale_to_list, renthub_low_orylist, redfinin_median_rent s, renthub_num_rental_listings, redfin_median_sale_price, redfin_pending_sales, renthub_average_rent
Ajatus:Voin kysyä taulukoista "renthub_average_rent" ja "zillow_rent" saadakseni keskimääräisen vuokrahinnan Chicagossa. Kyselen näiden taulukoiden skeemaa asiaankuuluvien sarakkeiden määrittämiseksi.
Toimi: sql_db_schema
Toiminnon syöttö: "renthub_average_rent, zillow_rent"
Havainto:
LUO TAULUKO renthub_average_rent (
period_start DATE NOT NULL,
period_end DATE NOT NULL,
period_type TEXT NOT NULL,
...
)/*
3 riviä renthub_average_rent-taulukosta:
jakson_alku jakson_loppu kauden_tyyppi geo_tyyppi ominaisuuden_tyyppi sijainnin_nimi dh_valtion_fips dh_osavaltion_nimi dh_valtio_abbr dh_county_fips dh_county_name dh_county_fullname dh_place_fips dh_place_name dh_place_dh_fullhcityid dh_neighborhood_name dh_zip_code is_seasonally_adjusted metriikka_arvo hg_date_updated
2022-02-01 2022-02-28 kuukausittainen naapurusto Talo Far North 48 Texas TX 085 Collin Collin County 19000 Dallas Dallasin kaupunki Dallas Dallasin kaupunki 273698 Kaukopohjoinen - Väärä 2543.752941176471 2543.752941176471 20203-35-35-3-3-3-3-3-3-3-3-3-3-3-3-5.
2020-12-01 2020-12-31 kuukausittainen naapurusto Kerrostalo Aurora Highlands 08 Colorado CO 001 Adams Adams County 04000 Aurora Aurora kaupunki Aurora Aurora kaupunki 342766 Aurora Highlands - Väärä 1306.80523435:28523435:285743 38.812353
2021-12-01 2021-12-31 kuukausittainen naapurusto Kerrostalo Penrose 51 Virginia VA 013 Arlington Arlington County 03000 Arlington Arlington CDP Arlington Arlington CDP 271765 Penrose - False 2009.924.2009. .812353
*/
LUO TAULUKKO zillow_rent (
period_start DATE NOT NULL,
period_end DATE NOT NULL,
period_type TEXT NOT NULL,
...
)
/*
3 riviä zillow_rent-taulukosta:
kauden_alku kauden_loppu kauden_tyyppi geo_tyyppi on_seasonally_adjusted property_type location_name location_fullname dh_state_fips dh_state_name dh_state_abbr dh_county_fips dh_county_name dh_county_fullname dh_place_fips_placehlhd_placehdcity city_fullname dh_zip_code metrinen_arvo hg_date_updated
*/
Ajatus:Voin tehdä kyselyn "renthub_average_rent"- ja "zillow_rent"-taulukoista saadakseni keskimääräisen vuokrahinnan Chicagossa. Asiaankuuluvat sarakkeet ovat "metric_value" "renthub_average_rent"-taulukossa ja "metric_value" "zillow_rent"-taulukossa. Kirjoitan kyselyn keskimääräisen vuokrahinnan laskemiseksi Chicagossa lokakuusta 2022 joulukuuhun 2022.
Toimi: sql_db_query_checker
Toiminnon syöttö: "SELECT AVG(metriikan_arvo) FROM renthub_average_rent WHERE location_name = 'Chicago' AND period_start >= '2022-10-01' AND period_end <= '2022-12-31'"
Huomautus: Alkuperäinen kysely ei sisällä yleisiä virheitä. Tässä on toistettu alkuperäinen kysely:
``` sql
SELECT AVG(mittarin_arvo)
FROM renthub_average_rent
WHERE location_name = 'Chicago'
JA periodin_aloitus >= '2022-10-01'
JA kauden_loppu <= '2022-12-31';
```
Ajatus: Kysely on oikea ja valmis suoritettavaksi, jotta saadaan Chicagon keskimääräinen vuokrahinta lokakuusta 2022 joulukuuhun 2022.
Toimi: sql_db_query
Toiminnon syöttö: "SELECT AVG(metriikan_arvo) FROM renthub_average_rent WHERE location_name = 'Chicago' AND period_start >= '2022-10-01' AND period_end <= '2022-12-31'"
Havainto: [(2344.4993233104487,)]
Ajatus: Keskimääräinen vuokrahinta Chicagossa lokakuusta 2022 joulukuuhun 2022 on 2344,50 $.
Lopullinen vastaus: 2344,50 dollaria
voilà
Keskustelu
Testimme aikana suoritimme useita kysymyksiä sekä SQLChainista että SQLAgentista GPT-3.5:n avulla ja vertasimme niiden tuloksia. Havaintomme paljasti, että SQLAgent suoritti SQLChainin paremmin vastaamalla useampaan kysymykseen. Esimerkiksi kun kysyttiin "Nouseeko Chicagon keskimääräinen vuokrahinta kesäkuusta 2022 maaliskuuhun 2023", SQLChainilta saamamme tulos on:
Chicagossa ei näytä olevan pöytää erityisesti keskimääräiseen vuokraukseen. Koska minulla ei ole pääsyä asiaankuuluviin tietoihin, en tiedä vastausta kysymykseen.
ja SQLAgentin tulos on:
Lopullinen vastaus: Chicagon keskimääräinen vuokrahinta nousee kesäkuusta 2022 maaliskuuhun 2023.
Tarkkuuden vuoksi havainnot osoittavat kuitenkin, että SQLAgentin antamat virheelliset vastaukset ovat yleisempiä. Yleisten puutteiden lisäksi (katso päätelmä kohdassaKuinka - LangChain SQLChain) käyttämällä LLM:ää tietokannan kyselyyn, oletamme, että SQLAgent yrittää toisinaan parhaansa vastata kysymykseen, vaikka SQL-kyselystä ei saada konkreettisia tuloksia. Kun esimerkiksi kysytään: "Nousevatko asuntojen hinnat San Diegossa marraskuusta 2022 joulukuuhun 2022?", SQLAgent tuottaa seuraavan ajatus- ja toimintaketjun:
Toimi: list_tables_sql_db
Toiminnon syöttö: ""Ajatus:Voin kysyä taulukoista "zillow_home_value_index" ja "zillow_home_value" saadakseni tietoa asuntojen hinnoista. Minun pitäisi kysyä näiden taulukoiden skeemaa nähdäkseni käytettävissä olevat sarakkeet.
Toimi: schema_sql_db
Toiminnon syöttö: "zillow_home_value_index, zillow_home_value"
Ajatus:Voin kysyä taulukoista "zillow_home_value_index" ja "zillow_home_value" saadakseni tietoa asuntojen hinnoista. Asiaankuuluvat sarakkeet ovat "period_start", "period_end", "location_name" ja "metric_value". Voin suodattaa tulokset sijainnin nimen "San Diego" ja marraskuun 2022 ja joulukuun 2022 välisen ajanjakson perusteella. Minun pitäisi käyttää "zillow_home_value" -taulukkoa, koska siinä on tarkempia kiinteistötyyppejä.
Toimi: query_sql_db
Toiminnon syöttö: "SELECT periodin_aloitus, jakson_loppu, sijainnin_nimi, metriikan_arvo FROM zillow_home_value WHERE sijainnin_nimi = 'San Diego' AND periodin_aloitus >= '2022-11-01' AND period_end <= '2022-12-31' LIMIT 10"
Havainto: []
Ajatus: Kyselyllä ei ole tuloksia. Tämä tarkoittaa, että San Diegon asuntojen hinnoista ei ole saatavilla tietoja marraskuusta 2022 joulukuuhun 2022.
Lopullinen vastaus: Ei, asuntojen hinnat eivät nouse San Diegossa marraskuusta 2022 joulukuuhun 2022.
Kuten näemme, SQLAgent ei havainnut mitään tietoja sql-kyselystä, mutta päätti antaa vastauksen joka tapauksessa.
Siksi, jos huomaat tarvitsevasi SQLAgentin kykyä rakentaa monimutkaisia kutsuketjuja kielimalleille ja muille työkaluille, olisi järkevää muotoilla hyvin määritellyt ja tarkat kysymykset samalla, kun myös ristiintarkistaa tulokset tietokantaasi.
Johtopäätös
LangChain SQLAgent on tehokas työkalu, joka luo monimutkaisia LLM-ketjukutsuja käyttäjien kysymyksiin vastaamiseksi. Vaikka se antaa vastauksen tärkeimpiin kysymyksiin, se ei pysty estämään LLM-hallusinaatioita.
Jos et ole lukenut blogia LangChain SQLChainin käytöstä, tutustu siihentässä. Kerromme myös, miten sitä käytetäänLlamaIndexLLM:ien yhdistämisestä tietokantoihin myöhemmin tässä kuussa, joten jos olet kiinnostunut oppimaan lisää LLM:n käyttämisestä tietokantakysymyksiin vastaamiseen, harkitse tilaamista, kiitos.