Ҳама моделҳои ҷойгиркунии матнро дӯст медоранд ва бо ин сабаб: Онҳо дар рамзгузории матни сохторнашуда бартарӣ доранд ва кашф кардани мундариҷаи семантикиро осонтар мекунанд. Тааҷҷубовар нест, ки онҳо асоси аксари барномаҳои RAG-ро ташкил медиҳанд, бахусус бо таваҷҷӯҳи ҳозира ба рамзгузорӣ ва дарёфти иттилооти мувофиқ аз ҳуҷҷатҳо ва дигар захираҳои матнӣ. Бо вуҷуди ин, мисолҳои возеҳи саволҳое мавҷуданд, ки шумо метавонед пурсед, ки дар куҷо равиши воридкунии матн ба замимаҳои RAG кӯтоҳ аст ва маълумоти нодуруст медиҳад.
Тавре зикр гардид, ҷойгиркунии матн дар рамзгузории матни сохторнашуда бузург аст. Аз тарафи дигар, онҳо дар кор бо иттилооти сохторӣ ва амалиётҳо ба монанди филтр , ҷудокунӣ ё ҷамъкунӣ он қадар хуб нестанд. Тасаввур кунед, ки як саволи оддӣ ба монанди:
Филми баландтарин дар соли 2024 кадом аст?
Барои ҷавоб додан ба ин савол, мо бояд аввал аз рӯи соли нашр филтр карда, баъд аз рӯи рейтинг ҷудо кунем. Мо дида мебароем, ки чӣ тавр як равиши соддалавҳона бо ҷобаҷогузории матн иҷро мешавад ва сипас нишон медиҳем, ки чӣ тавр бо чунин саволҳо мубориза бурдан мумкин аст. Ин пости блог нишон медиҳад, ки ҳангоми кор бо амалиёти сохтории додаҳо, аз қабили филтр, ҷудокунӣ ё ҷамъоварӣ, шумо бояд дигар абзорҳоро истифода баред, ки сохторро ба монанди графикҳои дониш таъмин мекунанд.
Рамз дар GitHub дастрас аст.
Барои ин пости блог, мо лоиҳаи тавсияҳоро дар Sandbox Neo4j истифода мебарем. Лоиҳаи тавсияҳо маҷмӯи додаҳои MovieLens -ро истифода мебарад, ки дорои филмҳо, актёрҳо, рейтингҳо ва маълумоти бештар мебошад.
Рамзи зерин як бастаи LangChain-ро барои пайваст шудан ба пойгоҳи додаҳои Neo4j эҷод мекунад:
os.environ["NEO4J_URI"] = "bolt://44.204.178.84:7687" os.environ["NEO4J_USERNAME"] = "neo4j" os.environ["NEO4J_PASSWORD"] = "minimums-triangle-saving" graph = Neo4jGraph(refresh_schema=False)
Илова бар ин, шумо калиди OpenAI API-ро талаб мекунед, ки шумо бо рамзи зерин мегузаред:
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
Дар базаи маълумот 10 000 филм мавҷуд аст, аммо воридкунии матн ҳанӯз захира нашудааст. Барои роҳ надодан ба ҳисоб кардани ҷойгиркунӣ барои ҳамаи онҳо, мо 1000 филми беҳтаринро бо нишони дуюмдараҷа бо номи Ҳадаф қайд мекунем:
graph.query(""" MATCH (m:Movie) WHERE m.imdbRating IS NOT NULL WITH m ORDER BY m.imdbRating DESC LIMIT 1000 SET m:Target """)
Муайян кардани он, ки чӣ кор кардан лозим аст, баррасии муҳим аст. Азбаски мо филтрро аз рӯи сол ва ҷудокуниро аз рӯи рейтинг нишон медиҳем, аз матни воридшуда хориҷ кардани он тафсилот аз рӯи адолат нест. Аз ин рӯ, ман интихоб кардам, ки соли баромад, рейтинг, унвон ва тавсифи ҳар як филмро сабт кунам.
Ин аст як мисоли матне, ки мо барои филми Гург аз Уолл Стрит ҷойгир мекунем:
plot: Based on the true story of Jordan Belfort, from his rise to a wealthy stock-broker living the high life to his fall involving crime, corruption and the federal government. title: Wolf of Wall Street, The year: 2013 imdbRating: 8.2
Шумо метавонед бигӯед, ки ин равиши хуб барои ворид кардани маълумоти сохторӣ нест ва ман баҳс намекунам, зеро ман беҳтарин равишро намедонам. Шояд ба ҷои ҷузъҳои арзишманд, мо бояд онҳоро ба матн ё чизе табдил диҳем. Ба ман хабар диҳед, ки агар шумо дар бораи он чизе, ки беҳтар кор карда метавонад, баъзе идеяҳо доред.
Объекти Neo4j Vector дар LangChain дорои усули қулай аз_existing_graph аст, ки дар он шумо метавонед интихоб кунед, ки кадом хосиятҳои матн бояд рамзгузорӣ шаванд:
embedding = OpenAIEmbeddings(model="text-embedding-3-small") neo4j_vector = Neo4jVector.from_existing_graph( embedding=embedding, index_name="movies", node_label="Target", text_node_properties=["plot", "title", "year", "imdbRating"], embedding_node_property="embedding", )
Дар ин мисол, мо модели матни дохилкунии 3-хурди OpenAI-ро барои тавлиди воридкунӣ истифода мебарем. Мо объекти Neo4jVector-ро бо истифода аз усули from_existing_graph оғоз мекунем. Параметри node_label гиреҳҳоеро, ки рамзгузорӣ мешаванд, филтр мекунад, махсусан онҳое, ки Ҳадаф нишон дода шудаанд. Параметри text_node_properties хосиятҳои гиреҳи дарунсохтро муайян мекунад, аз ҷумла plot , title , year ва imdbRating . Ниҳоят, embedding_node_property амволеро муайян мекунад, ки дар он ҷо дохилкуниҳои тавлидшуда нигоҳ дошта мешаванд ва ҳамчун embedding таъин карда мешаванд.
Биёед аз кӯшиши пайдо кардани филм дар асоси сюжет ё тавсифи он оғоз кунем:
pretty_print( neo4j_vector.similarity_search( "What is a movie where a little boy meets his hero?" ) )
Натиҷаҳо:
plot: A young boy befriends a giant robot from outer space that a paranoid government agent wants to destroy. title: Iron Giant, The year: 1999 imdbRating: 8.0 plot: After the death of a friend, a writer recounts a boyhood journey to find the body of a missing boy. title: Stand by Me year: 1986 imdbRating: 8.1 plot: A young, naive boy sets out alone on the road to find his wayward mother. Soon he finds an unlikely protector in a crotchety man and the two have a series of unexpected adventures along the way. title: Kikujiro (Kikujirô no natsu) year: 1999 imdbRating: 7.9 plot: While home sick in bed, a young boy's grandfather reads him a story called The Princess Bride. title: Princess Bride, The year: 1987 imdbRating: 8.1
Натиҷаҳо дар маҷмӯъ хеле қавӣ ба назар мерасанд. Дар он ҷо ҳамеша як писарбачаи хурдсол иштирок мекунад, гарчанде ки ман боварӣ надорам, ки ӯ ҳамеша бо қаҳрамони худ вохӯрад ё не. Боз ҳам, маҷмӯаи додаҳо танҳо 1000 филмро дар бар мегирад, аз ин рӯ имконот то андозае маҳдуданд.
Акнун биёед дархостеро санҷем, ки филтркунии асосиро талаб мекунад:
pretty_print( neo4j_vector.similarity_search( "Which movies are from year 2016?" ) )
Натиҷаҳо:
plot: Six short stories that explore the extremities of human behavior involving people in distress. title: Wild Tales year: 2014 imdbRating: 8.1 plot: A young man who survives a disaster at sea is hurtled into an epic journey of adventure and discovery. While cast away, he forms an unexpected connection with another survivor: a fearsome Bengal tiger. title: Life of Pi year: 2012 imdbRating: 8.0 plot: Based on the true story of Jordan Belfort, from his rise to a wealthy stock-broker living the high life to his fall involving crime, corruption and the federal government. title: Wolf of Wall Street, The year: 2013 imdbRating: 8.2 plot: After young Riley is uprooted from her Midwest life and moved to San Francisco, her emotions - Joy, Fear, Anger, Disgust and Sadness - conflict on how best to navigate a new city, house, and school. title: Inside Out year: 2015 imdbRating: 8.3
Ин хандаовар аст, аммо ягон филми соли 2016 интихоб нашудааст. Шояд мо метавонем бо омодасозии матнҳои гуногун барои рамзгузорӣ натиҷаҳои беҳтар ба даст орем. Бо вуҷуди ин, ҷобаҷогузории матн дар ин ҷо татбиқ намешавад, зеро мо бо амалиёти оддии сохтории додаҳо сарукор дорем, ки дар он мо бояд ҳуҷҷатҳоро филтр кунем ё дар ин мисол, филмҳо дар асоси моликияти метадата. Филтркунии метамаълумот як усули хуб ба роҳ мондашудаест, ки аксар вақт барои баланд бардоштани дақиқии системаҳои RAG истифода мешавад.
Дархости навбатӣ, ки мо кӯшиш хоҳем кард, каме ҷудокуниро талаб мекунад:
pretty_print( neo4j_vector.similarity_search("Which movie has the highest imdb score?") )
Натиҷаҳо:
plot: A silent film production company and cast make a difficult transition to sound. title: Singin' in the Rain year: 1952 imdbRating: 8.3 plot: A film about the greatest pre-Woodstock rock music festival. title: Monterey Pop year: 1968 imdbRating: 8.1 plot: This movie documents the Apollo missions perhaps the most definitively of any movie under two hours. Al Reinert watched all the footage shot during the missions--over 6,000,000 feet of it, ... title: For All Mankind year: 1989 imdbRating: 8.2 plot: An unscrupulous movie producer uses an actress, a director and a writer to achieve success. title: Bad and the Beautiful, The year: 1952 imdbRating: 7.9
Агар шумо бо рейтингҳои IMDb шинос бошед, шумо медонед, ки бисёре аз филмҳое ҳастанд, ки аз 8.3 боло баҳо мегиранд. Унвони баландтарин дар пойгоҳи додаи мо воқеан як силсила аст - Банди бародарон - бо рейтинги таъсирбахши 9,6. Бори дигар, ҷойгиркунии матн ҳангоми ба навъҳо ҷудо кардани натиҷаҳо суст кор мекунад.
Биёед инчунин саволеро арзёбӣ кунем, ки як навъ ҷамъбастро талаб мекунад:
pretty_print(neo4j_vector.similarity_search("How many movies are there?"))
Натиҷаҳо:
plot: Ten television drama films, each one based on one of the Ten Commandments. title: Decalogue, The (Dekalog) year: 1989 imdbRating: 9.2 plot: A documentary which challenges former Indonesian death-squad leaders to reenact their mass-killings in whichever cinematic genres they wish, including classic Hollywood crime scenarios and lavish musical numbers. title: Act of Killing, The year: 2012 imdbRating: 8.2 plot: A meek Hobbit and eight companions set out on a journey to destroy the One Ring and the Dark Lord Sauron. title: Lord of the Rings: The Fellowship of the Ring, The year: 2001 imdbRating: 8.8 plot: While Frodo and Sam edge closer to Mordor with the help of the shifty Gollum, the divided fellowship makes a stand against Sauron's new ally, Saruman, and his hordes of Isengard. title: Lord of the Rings: The Two Towers, The year: 2002 imdbRating: 8.7
Натиҷаҳо бешубҳа дар ин ҷо муфид нестанд, зеро мо чор филми тасодуфиро бармегардонем. Аз ин чор филми тасодуфӣ ба хулосае омадан амалан ғайриимкон аст, ки дар маҷмӯъ 1000 филм вуҷуд дорад, ки мо барои ин мисол нишон дода ва ворид кардаем.
Пас, роҳи ҳал чист? Ин оддӣ аст: Саволҳое, ки бо амалиёти сохторӣ, ба монанди филтр, ба навъбандӣ ва ҷамъбаст машғуланд, асбобҳоеро талаб мекунанд, ки барои кор бо маълумоти сохторӣ тарҳрезӣ шудаанд.
Дар айни замон, чунин ба назар мерасад, ки аксари одамон дар бораи равиши text2query фикр мекунанд, ки дар он LLM дархости махзани маълумотро барои ҳамкорӣ бо пойгоҳи додаҳо дар асоси савол ва схемаи пешниҳодшуда тавлид мекунад. Барои Neo4j, ин text2cypher аст, аммо барои пойгоҳи додаҳои SQL text2sql низ мавҷуд аст. Аммо, дар амал маълум мешавад, ки он барои истифодабарии истехсолот ба таври кофй эътимоднок ва устувор нест.
Арзёбии тавлиди изҳороти Cypher. Аз пости блоги ман дар бораи арзёбии Cypher гирифта шудааст.
Шумо метавонед усулҳоро ба монанди занҷири фикр, мисолҳои чандкарата ё танзими дақиқ истифода баред, аммо ноил шудан ба дақиқии баланд дар ин марҳила қариб ғайриимкон аст. Усули text2query барои саволҳои оддӣ дар схемаҳои мустақими пойгоҳи додаҳо хуб кор мекунад, аммо ин воқеияти муҳити истеҳсолӣ нест. Барои ҳалли ин, мо мураккабии тавлиди дархостҳои пойгоҳи додаҳоро аз LLM дур месозем ва онро ҳамчун як мушкилоти код баррасӣ мекунем, ки дар он мо дархостҳои пойгоҳи додаҳоро ба таври муайян дар асоси вурудоти функсия тавлид мекунем. Бартарии он устувории ба таври назаррас беҳтаршуда аст, гарчанде ки он аз ҳисоби кам шудани чандирии он меояд. Беҳтар аст, ки доираи аризаи RAG танг карда шавад ва ба ин саволҳо дақиқ ҷавоб диҳед, на кӯшиши ҷавоб додан ба ҳама чиз, балки онро нодуруст иҷро кунед.
Азбаски мо дархостҳои пойгоҳи додаҳоро тавлид мекунем - дар ин ҳолат, изҳороти Cypher - дар асоси вурудоти функсионалӣ, мо метавонем аз имкониятҳои асбобҳои LLM истифода барем. Дар ин раванд, LLM параметрҳои мувофиқро дар асоси вуруди корбар пур мекунад, дар ҳоле ки функсия дарёфти иттилооти заруриро идора мекунад. Барои ин намоиш, мо аввал ду асбобро амалӣ менамоем: яке барои ҳисоб кардани филмҳо ва дигаре барои рӯйхати онҳо, ва сипас бо истифода аз LangGraph агенти LLM эҷод кунед.
Мо аз татбиқи асбоб барои ҳисоб кардани филмҳо дар асоси филтрҳои пешакӣ муайяншуда оғоз мекунем. Аввалан, мо бояд муайян кунем, ки ин филтрҳо чистанд ва ба LLM кай ва чӣ тавр истифода бурдани онҳоро тавсиф мекунанд:
class MovieCountInput(BaseModel): min_year: Optional[int] = Field( description="Minimum release year of the movies" ) max_year: Optional[int] = Field( description="Maximum release year of the movies" ) min_rating: Optional[float] = Field(description="Minimum imdb rating") grouping_key: Optional[str] = Field( description="The key to group by the aggregation", enum=["year"] )
LangChain якчанд роҳҳоро барои муайян кардани воридоти функсионалӣ пешниҳод мекунад, аммо ман равиши Pydanticро афзалтар медонам. Дар ин мисол, мо барои такмил додани натиҷаҳои филм се филтр дорем: min_year, max_year ва min_rating. Ин филтрҳо ба маълумоти сохторӣ асос ёфтаанд ва ихтиёрӣ мебошанд, зеро корбар метавонад интихоб кунад, ки ҳама, ҳама ё ҳеҷ кадоми онҳоро дохил кунад. Илова бар ин, мо вуруди grouping_key-ро ҷорӣ кардем, ки ба функсия мегӯяд, ки шумо ҳисобро аз рӯи моликияти мушаххас гурӯҳбандӣ кунед. Дар ин ҳолат, ягона гурӯҳбандии дастгирӣшаванда аз рӯи сол аст, ки дар рӯйхат муайян карда шудааст.
Акнун биёед функсияи воқеиро муайян кунем:
@tool("movie-count", args_schema=MovieCountInput) def movie_count( min_year: Optional[int], max_year: Optional[int], min_rating: Optional[float], grouping_key: Optional[str], ) -> List[Dict]: """Calculate the count of movies based on particular filters""" filters = [ ("t.year >= $min_year", min_year), ("t.year <= $max_year", max_year), ("t.imdbRating >= $min_rating", min_rating), ] # Create the parameters dynamically from function inputs params = { extract_param_name(condition): value for condition, value in filters if value is not None } where_clause = " AND ".join( [condition for condition, value in filters if value is not None] ) cypher_statement = "MATCH (t:Target) " if where_clause: cypher_statement += f"WHERE {where_clause} " return_clause = ( f"t.`{grouping_key}`, count(t) AS movie_count" if grouping_key else "count(t) AS movie_count" ) cypher_statement += f"RETURN {return_clause}" print(cypher_statement) # Debugging output return graph.query(cypher_statement, params=params)
Функсияи movie_count дархости Cypherро барои ҳисоб кардани филмҳо дар асоси филтрҳои ихтиёрӣ ва калиди гурӯҳбандӣ тавлид мекунад. Он аз муайян кардани рӯйхати филтрҳо бо арзишҳои мувофиқ, ки ҳамчун аргумент пешниҳод шудаанд, оғоз меёбад. Филтрҳо барои ба таври динамикӣ сохтани банди WHERE истифода мешаванд, ки барои татбиқи шартҳои филтркунии муайяншуда дар изҳороти Cypher масъул аст, аз ҷумла танҳо шартҳое, ки арзишҳо Ҳеҷ нестанд.
Баъдан банди RETURN-и дархости Cypher сохта мешавад, ё гурӯҳбандӣ аз рӯи гурӯҳи_калиди пешниҳодшуда ё танҳо бо ҳисоб кардани шумораи умумии филмҳо. Дар ниҳоят, функсия дархостро иҷро мекунад ва натиҷаҳоро бармегардонад.
Функсияро метавон бо далелҳои бештар ва мантиқи бештар ҷалб кард, агар лозим бошад, аммо муҳим аст, ки он равшан боқӣ монад, то LLM онро дуруст ва дақиқ даъват кунад.
Боз, мо бояд аз муайян кардани аргументҳои функсия оғоз кунем:
class MovieListInput(BaseModel): sort_by: str = Field( description="How to sort movies, can be one of either latest, rating", enum=["latest", "rating"], ) k: Optional[int] = Field(description="Number of movies to return") description: Optional[str] = Field(description="Description of the movies") min_year: Optional[int] = Field( description="Minimum release year of the movies" ) max_year: Optional[int] = Field( description="Maximum release year of the movies" ) min_rating: Optional[float] = Field(description="Minimum imdb rating")
Мо ҳамон се филтрро, ки дар функсияи ҳисобкунии филм нигоҳ медорем, аммо далели тавсифро илова мекунем. Ин далел ба мо имкон медиҳад, ки филмҳоро дар асоси нақшаи онҳо бо истифода аз ҷустуҷӯи шабоҳати векторӣ ҷустуҷӯ ва номбар кунем. Танҳо аз он сабаб, ки мо абзорҳо ва филтрҳои сохториро истифода мебарем, ин маънои онро надорад, ки мо воридкунии матн ва усулҳои ҷустуҷӯи векториро ворид карда наметавонем. Азбаски мо намехоҳем, ки ҳама филмҳоро аксар вақт баргардонем, мо вуруди ихтиёрии k-ро бо арзиши пешфарз дохил мекунем. Илова бар ин, барои рӯйхат, мо мехоҳем филмҳоро ҷудо кунем, то танҳо филмҳои мувофиқтаринро баргардонем. Дар ин ҳолат, мо метавонем онҳоро аз рӯи рейтинг ё соли баромад ҷудо кунем.
Биёед функсияро иҷро кунем:
@tool("movie-list", args_schema=MovieListInput) def movie_list( sort_by: str = "rating", k : int = 4, description: Optional[str] = None, min_year: Optional[int] = None, max_year: Optional[int] = None, min_rating: Optional[float] = None, ) -> List[Dict]: """List movies based on particular filters""" # Handle vector-only search when no prefiltering is applied if description and not min_year and not max_year and not min_rating: return neo4j_vector.similarity_search(description, k=k) filters = [ ("t.year >= $min_year", min_year), ("t.year <= $max_year", max_year), ("t.imdbRating >= $min_rating", min_rating), ] # Create parameters dynamically from function arguments params = { key.split("$")[1]: value for key, value in filters if value is not None } where_clause = " AND ".join( [condition for condition, value in filters if value is not None] ) cypher_statement = "MATCH (t:Target) " if where_clause: cypher_statement += f"WHERE {where_clause} " # Add the return clause with sorting cypher_statement += " RETURN t.title AS title, t.year AS year, t.imdbRating AS rating ORDER BY " # Handle sorting logic based on description or other criteria if description: cypher_statement += ( "vector.similarity.cosine(t.embedding, $embedding) DESC " ) params["embedding"] = embedding.embed_query(description) elif sort_by == "rating": cypher_statement += "t.imdbRating DESC " else: # sort by latest year cypher_statement += "t.year DESC " cypher_statement += " LIMIT toInteger($limit)" params["limit"] = k or 4 print(cypher_statement) # Debugging output data = graph.query(cypher_statement, params=params) return data
Ин функсия рӯйхати филмҳоро дар асоси якчанд филтрҳои ихтиёрӣ дарёфт мекунад: тавсиф, диапазони сол, рейтинги ҳадди ақал ва афзалиятҳои ҷудокунӣ. Агар танҳо тавсиф бидуни филтрҳои дигар дода шавад, он барои ёфтани филмҳои мувофиқ ҷустуҷӯи шабеҳи индекси векториро анҷом медиҳад. Вақте ки филтрҳои иловагӣ татбиқ карда мешаванд, функсия дархости Cypherро барои мувофиқ кардани филмҳо дар асоси меъёрҳои муайяншуда месозад, ба монанди соли нашр ва рейтинги IMDb, ки онҳоро бо шабоҳати ихтиёрӣ дар асоси тавсиф муттаҳид мекунад. Сипас натиҷаҳо аз рӯи холҳои монандӣ, рейтинги IMDb ё сол мураттаб карда мешаванд ва бо k филмҳо маҳдуд карда мешаванд.
Мо бо истифода аз LangGraph агенти мустақими ReAct-ро татбиқ хоҳем кард.
Агент аз LLM ва қадами асбобҳо иборат аст. Вақте ки мо бо агент ҳамкорӣ мекунем, мо аввал ба LLM занг мезанем, то тасмим бигирем, ки оё мо асбобҳоро истифода барем. Пас мо як давраро иҷро мекунем:
Татбиқи код ба қадри имкон осон аст. Аввал мо асбобҳоро ба LLM мепайвандем ва қадами ёрирасонро муайян мекунем:
llm = ChatOpenAI(model='gpt-4-turbo') tools = [movie_count, movie_list] llm_with_tools = llm.bind_tools(tools) # System message sys_msg = SystemMessage(content="You are a helpful assistant tasked with finding and explaining relevant information about movies.") # Node def assistant(state: MessagesState): return {"messages": [llm_with_tools.invoke([sys_msg] + state["messages"])]}
Баъдан мо ҷараёни LangGraph-ро муайян мекунем:
# Graph builder = StateGraph(MessagesState) # Define nodes: these do the work builder.add_node("assistant", assistant) builder.add_node("tools", ToolNode(tools)) # Define edges: these determine how the control flow moves builder.add_edge(START, "assistant") builder.add_conditional_edges( "assistant", # If the latest message (result) from assistant is a tool call -> tools_condition routes to tools # If the latest message (result) from assistant is a not a tool call -> tools_condition routes to END tools_condition, ) builder.add_edge("tools", "assistant") react_graph = builder.compile()
Мо дар LangGraph ду гиреҳро муайян мекунем ва онҳоро бо канори шартӣ пайваст мекунем. Агар асбоб даъват карда шавад, ҷараён ба асбобҳо равона карда мешавад; дар акси ҳол, натиҷаҳо ба корбар баргардонида мешаванд.
Биёед ҳоло агенти худро санҷем:
messages = [ HumanMessage( content="What are the some movies about a girl meeting her hero?" ) ] messages = react_graph.invoke({"messages": messages}) for m in messages["messages"]: m.pretty_print()
Натиҷаҳо:
Дар қадами аввал, агент истифодаи абзори рӯйхати филмҳоро бо параметри тавсифи мувофиқ интихоб мекунад. Маълум нест, ки чаро он квали 5-ро интихоб мекунад, аммо ба назар чунин мерасад, ки ин рақамро дастгирӣ мекунад. Восита панҷ филми мувофиқтаринро дар асоси сюжет бармегардонад ва LLM дар охир онҳоро барои корбар ҷамъбаст мекунад.
Агар мо аз ChatGPT пурсем, ки чаро он арзиши k 5-ро дӯст медорад, мо ҷавоби зеринро мегирем.
Сипас, биёед як саволи каме мураккабтареро пурсем, ки филтркунии метамаълумотро талаб мекунад:
messages = [ HumanMessage( content="What are the movies from the 90s about a girl meeting her hero?" ) ] messages = react_graph.invoke({"messages": messages}) for m in messages["messages"]: m.pretty_print()
Натиҷаҳо:
Ин дафъа, далелҳои иловагӣ барои филтр кардани филмҳо танҳо аз солҳои 1990 истифода шуданд. Ин мисол намунаи маъмулии филтркунии метамаълумот бо истифода аз равиши пеш аз филтр мебошад. Изҳороти Cypher тавлидшуда аввал филмҳоро тавассути филтр дар соли баромадашон маҳдуд мекунад. Дар қисми навбатӣ, изҳороти Cypher барои пайдо кардани филмҳо дар бораи вохӯрии духтари хурде, ки бо қаҳрамонаш вохӯрда буд, дохилкунии матн ва ҷустуҷӯи шабоҳати векториро истифода мебарад.
Биёед кӯшиш кунем, ки филмҳоро дар асоси шароитҳои гуногун ҳисоб кунем:
messages = [ HumanMessage( content="How many movies are from the 90s have the rating higher than 9.1?" ) ] messages = react_graph.invoke({"messages": messages}) for m in messages["messages"]: m.pretty_print()
Натиҷаҳо:
Бо асбоби махсус барои ҳисобкунӣ, мураккабӣ аз LLM ба асбоб мегузарад ва LLM танҳо барои пур кардани параметрҳои мувофиқи функсия масъул аст. Ин ҷудокунии вазифаҳо системаро самараноктар ва мустаҳкамтар мекунад ва мураккабии вуруди LLM-ро коҳиш медиҳад.
Азбаски агент метавонад якчанд асбобҳоро пайдарпай ё мувозӣ истифода барад, биёед онро бо чизи боз ҳам мураккабтар санҷем:
messages = [ HumanMessage( content="How many were movies released per year made after the highest rated movie?" ) ] messages = react_graph.invoke({"messages": messages}) for m in messages["messages"]: m.pretty_print()
Натиҷаҳо
Тавре зикр гардид, агент метавонад асбобҳои сершуморро барои ҷамъ овардани тамоми маълумоти зарурӣ барои ҷавоб ба савол истифода барад. Дар ин мисол, он бо номбар кардани филмҳои баландтарин баҳо дода мешавад, то муайян кунад, ки филми баландтарин кай бароварда шудааст. Пас аз он ки он ин маълумотро дорад, он асбоби ҳисобкунии филмҳоро даъват мекунад, то шумораи филмҳои пас аз соли муайян баровардашударо бо истифода аз калиди гурӯҳбандӣ, ки дар савол муайян шудааст, ҷамъ кунад.
Дар ҳоле ки ҷобаҷогузории матнҳо барои ҷустуҷӯи маълумотҳои сохторнашуда аъло мебошанд, онҳо дар мавриди амалиёти сохторӣ, ба монанди филтр , ҷудокунӣ ва ҷамъоварӣ кӯтоҳанд. Ин вазифаҳо асбобҳоеро талаб мекунанд, ки барои маълумоти сохторӣ тарҳрезӣ шудаанд, ки дақиқ ва чандирии заруриро барои идора кардани ин амалиёт пешниҳод мекунанд. Баррасии асосӣ дар он аст, ки васеъ кардани маҷмӯи асбобҳо дар системаи шумо ба шумо имкон медиҳад, ки доираи васеи дархостҳои корбаронро ҳал кунед ва барномаҳои худро мустаҳкамтар ва ҳамаҷониба гардонед. Якҷоя кардани равишҳои сохтории додаҳо ва усулҳои ҷустуҷӯи матнии сохторнашуда метавонад посухҳои дақиқтар ва мувофиқро пешкаш кунад ва дар ниҳоят таҷрибаи корбарро дар барномаҳои RAG беҳтар созад.
Чун ҳамеша, код дар GitHub дастрас аст.
Барои гирифтани маълумоти бештар дар бораи ин мавзӯъ, дар NODES 2024 7 ноябр ба мо ҳамроҳ шавед, конфронси ройгони виртуалии таҳиягарони мо оид ба барномаҳои интеллектуалӣ, графикҳои дониш ва AI. Ҳоло сабти ном шавед!