๐ซ ๋ณด๊ณ ์ ๋ฐ ์ง์ ๊ทธ๋ํ ์์ฑ์ ์ํ CAMEL ๋กคํ๋ ์ ์คํฌ๋ํผ
๐ซ ๋ณด๊ณ ์ ๋ฐ ์ง์ ๊ทธ๋ํ ์์ฑ์ ์ํ CAMEL ๋กคํ๋ ์ ์คํฌ๋ํผ
CAMEL์ RAG์ Firecrawl์ ๊ฒฐํฉํด ์น ์คํฌ๋ํ, ๋ค์ค ์์ด์ ํธ ๋กคํ๋ ์ ์์ , ์ง์ ๊ทธ๋ํ ๊ตฌ์ถ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๋ ๋ฌธ์์์. Mistral์ ๋ชจ๋ธ๋ก 2024 ํ๋ฆฌ ์ฌ๋ฆผํฝ ํฐํค ์ฌ์์ ๋ํ ์ข ํฉ ์ฐ๊ตฌ๋ฅผ ์ํํ๋ ์์๋ฅผ ๋ค๋ฃน๋๋ค.
์ถ์ฒ: ๋ฌธ์
๋ณธ๋ฌธ
์ด ๋ ธํธ๋ถ์ CAMEL์ RAG(๊ฒ์ ์ฆ๊ฐ ์์ฑ)์ Firecrawl์ ๊ฒฐํฉํด ํจ์จ์ ์ธ ์น ์คํฌ๋ํ, ๋ค์ค ์์ด์ ํธ ๋กคํ๋ ์ ์์ , ์ง์ ๊ทธ๋ํ ๊ตฌ์ถ์ ์ค์ ํ๊ณ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค์. Mistral์ ๋ชจ๋ธ๋ก 2024 ํ๋ฆฌ ์ฌ๋ฆผํฝ์ ํฐํค ์ฌ์์ ๋ํ ์ข ํฉ ์ฐ๊ตฌ๋ฅผ ์ํํ๋ ์์๋ฅผ ์ดํด๋ณผ๊ฒ์.
์ด ๋ ธํธ๋ถ์์ ๋ฐฐ์ธ ๋ด์ฉ:
- CAMEL: RAG์ ๋ค์ค ์์ด์ ํธ ๋กคํ๋ ์ ์๋๋ฆฌ์ค๋ฅผ ์ง์ํ๋ ๊ฐ๋ ฅํ ๋ค์ค ์์ด์ ํธ ํ๋ ์์ํฌ
- Mistral: ์ต์ฒจ๋จ ์ธ์ด ๋ชจ๋ธ๋ก, ์ธ๋ถ ํจ์๋ฅผ ์คํํ๋ ๋๊ตฌ ํธ์ถ ๋ฅ๋ ฅ๊ณผ ๊ฐ๋ ฅํ ์๋ฒ ๋ฉ์ ์ ๊ณตํด ์๋ฏธ ๊ฒ์๊ณผ ์ฝํ ์ธ ๊ฒ์์ ์ฌ์ฉ
- Firecrawl: ๋ค์ํ ์น ํ์ด์ง์์ ์ฝํ ์ธ ๋ฅผ ์ถ์ถยท์ ๋ฆฌํ๋ ๊ฐ๋ ฅํ ์น ์คํฌ๋ํ ๋๊ตฌ
- AgentOps: CAMEL ์์ด์ ํธ์ ์คํ์ ์ถ์ ยท๋ถ์
- Qdrant: CAMEL์ AutoRetriever์ ํจ๊ป ์ฌ์ฉ๋๋ ํจ์จ์ ์ธ ๋ฒกํฐ ์คํ ๋ฆฌ์ง ์์คํ
- Neo4j: ์ํฐํฐ ๊ฐ ๋ณต์กํ ๊ด๊ณ๋ฅผ ํจ์จ์ ์ผ๋ก ๋งคํยท์ฟผ๋ฆฌํ ์ ์๊ฒ ํ๋ ์ ๋์ ์ธ ๊ทธ๋ํ DBMS
- DuckDuckGo Search: SearchToolkit ๋ด์์ ์น์์ ๊ด๋ จ URL๊ณผ ์ ๋ณด๋ฅผ ์์งํ๋ ๊ธฐ๋ณธ ๊ฒ์ ์์ง
- Unstructured IO: ์ฝํ ์ธ ์ฒญํน์ ์ฌ์ฉ๋์ด ๋น์ ํ ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ์ฉ์ดํ๊ฒ ํจ
์ด ์ค์ ์ ์ค์ฉ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ฌ์ค ๋ฟ ์๋๋ผ, ๊ณ ๊ธ ์น ์ ๋ณด ๊ฒ์, AI ํ์ , ๋ค์ค ์์ค ๋ฐ์ดํฐ ์ง๊ณ๊ฐ ํ์ํ ๋ค์ํ ์๋๋ฆฌ์ค์ ์ ์ฉํ ์ ์๋ ์ ์ฐํ ํ๋ ์์ํฌ ์ญํ ์ ํด์.
โญ Star the Repo
CAMEL์ด ์ ์ฉํ๊ฑฐ๋ ํฅ๋ฏธ๋กญ๋ค๋ฉด [CAMEL GitHub Repo]์ ์คํ๋ฅผ ์ฃผ๋ ๊ฑธ ๊ณ ๋ คํด ์ฃผ์ธ์!
๐ฆ ์ค์น (Installation)
๋จผ์ CAMEL ํจํค์ง๋ฅผ ๋ชจ๋ ์์กด์ฑ๊ณผ ํจ๊ป ์ค์นํด์.
pip install camel-ai[all]==0.1.6.4
๐ API ํค ์ค์ (Setting Up API Keys)
Mistral AI, Firecrawl, AgentOps์ฉ API ํค๋ฅผ ์ค์ ํด์ผ ํด์. ์ด๋ ๊ฒ ํ๋ฉด ๋๊ตฌ๋ค์ด ์ธ๋ถ ์๋น์ค์ ์์ ํ๊ฒ ์ํธ์์ฉํ ์ ์์ด์. [์ฌ๊ธฐ]์์ AgentOps API ํค๋ฅผ ๋ฌด๋ฃ๋ก ์ป์ ์ ์์ด์.
import os
from getpass import getpass
# Prompt for the AgentOps API key securely
agentops_api_key = getpass('Enter your API key: ')
os.environ["AGENTOPS_API_KEY"] = agentops_api_key
[์ฌ๊ธฐ]์์ ๋ฌด๋ฃ ํฌ๋ ๋ง์ผ๋ก Mistral AI API ํค๋ฅผ ์ป์ ์ ์์ด์.
# Prompt for the API key securely
mistral_api_key = getpass('Enter your API key: ')
os.environ["MISTRAL_API_KEY"] = mistral_api_key
CAMEL ModelFactory๋ก Mistral Large 2 ๋ชจ๋ธ์ ์ค์ ํด์. ํ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ชจ๋ธ๋ ๊ตฌ์ฑํ ์ ์์ด์.
from camel.models import ModelFactory
from camel.types import ModelPlatformType, ModelType
from camel.configs import MistralConfig
# Set up model
mistral_large_2 = ModelFactory.create(
model_platform=ModelPlatformType.MISTRAL,
model_type=ModelType.MISTRAL_LARGE,
model_config_dict=MistralConfig(temperature=0.2).as_dict(),
)
[์ฌ๊ธฐ]์์ ๋ฌด๋ฃ ํฌ๋ ๋ง์ผ๋ก Firecrawl API ํค๋ฅผ ์ป์ ์ ์์ด์.
# Prompt for the Firecrawl API key securely
firecrawl_api_key = getpass('Enter your API key: ')
os.environ["FIRECRAWL_API_KEY"] = firecrawl_api_key
๐ Firecrawl๋ก ์น ์คํฌ๋ํ (Web Scraping with Firecrawl)
Firecrawl์ ์น ํ์ด์ง์์ ์ฝํ ์ธ ๋ฅผ ์คํฌ๋ํํ๊ณ ์ ๋ฆฌํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์์. ์ด ์น์ ์์๋ CAMEL AI ์น์ฌ์ดํธ์ ํน์ ํฌ์คํธ ์ฝํ ์ธ ๋ฅผ ์์๋ก ์คํฌ๋ํํด์.
from camel.loaders import Firecrawl
firecrawl = Firecrawl()
# Scrape and clean content from a specified URL
response = firecrawl.tidy_scrape(
url="https://www.camel-ai.org/post/crab"
)
print(response)
๐ Firecrawl์ URL์์ ๊นจ๋ํ๊ณ LLM ์นํ์ ์ธ ์ฝํ ์ธ ๋ฅผ ์ฝ๊ฒ ์ป์ ์ ์๊ฒ ํด์ค์!
๐ ๏ธ CAMEL์ RAG์ Firecrawl๋ก ์น ์ ๋ณด ๊ฒ์
์ด ์น์ ์์๋ CAMEL์ RAG ๋ชจ๋ธ๋ก URL ๋ชฉ๋ก์์ ๊ด๋ จ ์ ๋ณด๋ฅผ ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ๋๋ฆด๊ฒ์. ์ด๋ ์ฌ๋ฌ ์์ค์ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณยท๋ถ์ํ๋ ๋ฐ ํนํ ์ ์ฉํด์.
Firecrawl์ CAMEL์ RAG์ ํจ๊ป ์ค์
๋ค์ ํจ์๋ ์ฃผ์ด์ง ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก URL ๋ชฉ๋ก์์ ๊ด๋ จ ์ ๋ณด๋ฅผ ๊ฒ์ํด์. Firecrawl๋ก ์น ์คํฌ๋ํ๊ณผ CAMEL์ AutoRetriever๋ฅผ ๊ฒฐํฉํด ์ํํ ์ ๋ณด ๊ฒ์ ๊ณผ์ ์ ๋ง๋ญ๋๋ค.
from camel.retrievers import AutoRetriever
from camel.toolkits import OpenAIFunction, SearchToolkit
from camel.types import ModelPlatformType, ModelType, StorageType
from camel.embeddings import MistralEmbedding
def retrieve_information_from_urls(urls: list[str], query: str) -> str:
r"""Retrieves relevant information from a list of URLs based on a given
query.
This function uses the `Firecrawl` tool to scrape content from the
provided URLs and then uses the `AutoRetriever` from CAMEL to retrieve the
most relevant information based on the query from the scraped content.
Args:
urls (list[str]): A list of URLs to scrape content from.
query (str): The query string to search for relevant information.
Returns:
str: The most relevant information retrieved based on the query.
Example:
>>> urls = ["https://example.com/article1", "https://example.com/
article2"]
>>> query = "latest advancements in AI"
>>> result = retrieve_information_from_urls(urls, query)
"""
aggregated_content = ''
# Scrape and aggregate content from each URL
for url in urls:
scraped_content = Firecrawl().tidy_scrape(url)
aggregated_content += scraped_content
# Set up a vector retriever with local storage and embedding model from Mistral AI
auto_retriever = AutoRetriever(
vector_storage_local_path="local_data",
storage_type=StorageType.QDRANT,
embedding_model=MistralEmbedding(),
)
# Retrieve the most relevant information based on the query
# You can adjust the top_k and similarity_threshold value based on your needs
retrieved_info = auto_retriever.run_vector_retriever(
query=query,
contents=aggregated_content,
top_k=3,
similarity_threshold=0.5,
)
return retrieved_info
๊ฒ์ ํจ์๋ฅผ ํ ์คํธํด ๋ณผ๊ฒ์. 2024 ์ฌ๋ฆผํฝ์ ๋ํ ์ ๋ณด๋ฅผ ์์งํด ๋ณด๊ฒ ์ด์. ์ฒซ ์คํ์ ๋ก์ปฌ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ตฌ์ถํด์ผ ํด์ ์ฝ 50์ด๊ฐ ๊ฑธ๋ฆด ์ ์์ด์.
retrieved_info = retrieve_information_from_urls(
query="Which country won the most golden prize in 2024 Olympics?",
urls=[
"https://www.nbcnews.com/sports/olympics/united-states-china-gold-medals-rcna166013",
],
)
print(retrieved_info)
๐ CAMEL์ RAG ํ์ดํ๋ผ์ธ๊ณผ Firecrawl์ tidy ์คํฌ๋ํ ๋๋ถ์ ์ด ํจ์๋ ์ง์ ๋ URL์์ ๊ด๋ จ ์ ๋ณด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ฒ์ํด์! ์ด์ ์ด ํจ์๋ฅผ CAMEL ์์ด์ ํธ์ ํตํฉํด ๊ฒ์ ๊ณผ์ ์ ๋ ์๋ํํ ์ ์์ด์.
๐น AgentOps๋ก AI ์์ด์ ํธ ๋ชจ๋ํฐ๋ง (Monitoring AI Agents with AgentOps)
import agentops
agentops.init(default_tags=["CAMEL cookbook"])
๐ง ์ง์ ๊ทธ๋ํ ๊ตฌ์ถ (Knowledge Graph Construction)
CAMEL์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ค ํ๋๋ ํ ์คํธ ๋ฐ์ดํฐ์์ ์ง์ ๊ทธ๋ํ๋ฅผ ๊ตฌ์ถยท์ ์ฅํ๋ ๋ฅ๋ ฅ์ด์์. ์ด๋ ๋ฐ์ดํฐ ๋ด ๊ด๊ณ์ ๊ณ ๊ธ ๋ถ์๊ณผ ์๊ฐํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
Neo4j ์ธ์คํด์ค๋ฅผ URL, ์ฌ์ฉ์ ์ด๋ฆ, ๋น๋ฐ๋ฒํธ๋ก ์ค์ ํด์. [์ฌ๊ธฐ]์ ์๋ด๊ฐ ์๊ณ , ๋ค์ด๋ก๋ํ .txt ํ์ผ์์ ์๊ฒฉ ์ฆ๋ช
์ ํ์ธํ์ธ์. ๋ฐฉ๊ธ ์ธ์คํด์ค๋ฅผ ์ค์ ํ๋ค๋ฉด ์ต๋ 60์ด๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ ์ ์์ด์.
from camel.storages import Neo4jGraph
from camel.loaders import UnstructuredIO
from camel.agents import KnowledgeGraphAgent
def knowledge_graph_builder(text_input: str) -> None:
r"""Build and store a knowledge graph from the provided text.
This function processes the input text to create and extract nodes and relationships,
which are then added to a Neo4j database as a knowledge graph.
Args:
text_input (str): The input text from which the knowledge graph is to be constructed.
Returns:
graph_elements: The generated graph element from knowlegde graph agent.
"""
# Set Neo4j instance
n4j = Neo4jGraph(
url="Your_URI",
username="Your_Username",
password="Your_Password",
)
# Initialize instances
uio = UnstructuredIO()
kg_agent = KnowledgeGraphAgent(model=mistral_large_2)
# Create an element from the provided text
element_example = uio.create_element_from_text(text_input, element_id="001")
# Extract nodes and relationships using the Knowledge Graph Agent
graph_elements = kg_agent.run(element_example, parse_graph_elements=True)
# Add the extracted graph elements to the Neo4j database
n4j.add_graph_elements(graph_elements=[graph_elements])
return graph_elements
๐ค๐ค CAMEL๋ก ๋ค์ค ์์ด์ ํธ ๋กคํ๋ ์ (Multi-Agent Role-Playing with CAMEL)
์ด ์น์ ์ AI ์์ด์ ํธ๋ค์ด ๋ค์ํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด ์์ ์ ์ํํ๋๋ก ์ํธ์์ฉํ๋ ๋กคํ๋ ์ ์ธ์ ์ ์ค์ ํด์. ์ด์์คํดํธ ์์ด์ ํธ๊ฐ 2024 ํ๋ฆฌ ์ฌ๋ฆผํฝ์ ํฐํค ์ฌ์์ ๋ํ ์ข ํฉ ์ฐ๊ตฌ๋ฅผ ์ํํ๋๋ก ์๋ดํ ๊ฒ์.
from typing import List
from colorama import Fore
from camel.agents.chat_agent import FunctionCallingRecord
from camel.societies import RolePlaying
from camel.utils import print_text_animated
์์ ํ๋กฌํํธ ์ ์
task_prompt = """Do a comprehensive study of the Turkish shooter in 2024 paris
olympics, write a report for me, then create a knowledge graph for the report.
You should use search tool to get related URLs first, then use retrieval tool
to get the retrieved content back by providing the list of URLs, finially
use tool to build the knowledge graph to finish the task.
No more other actions needed"""
์ด์์คํดํธ ์์ด์ ํธ๋ฅผ ์ํ ๊ณ์ฐ, ์น ์ ๋ณด ๊ฒ์, ์ง์ ๊ทธ๋ํ ๊ตฌ์ถ์ฉ ๋๊ตฌ๋ก ๊ตฌ์ฑํด์.
retrieval_tool = OpenAIFunction(retrieve_information_from_urls)
search_tool = OpenAIFunction(SearchToolkit().search_duckduckgo)
knowledge_graph_tool = OpenAIFunction(knowledge_graph_builder)
tool_list = [
retrieval_tool,
search_tool,
knowledge_graph_tool,
]
assistant_model_config = MistralConfig(
tools=tool_list,
temperature=0.0,
)
๋กคํ๋ ์ ์ธ์ ์ค์
# Initialize the role-playing session
role_play_session = RolePlaying(
assistant_role_name="CAMEL Assistant",
user_role_name="CAMEL User",
assistant_agent_kwargs=dict(
model=ModelFactory.create(
model_platform=ModelPlatformType.MISTRAL,
model_type=ModelType.MISTRAL_LARGE,
model_config_dict=assistant_model_config.as_dict(),
),
tools=tool_list,
),
user_agent_kwargs=dict(model=mistral_large_2),
task_prompt=task_prompt,
with_task_specify=False,
)
์์คํ ๋ฉ์์ง์ ์์ ํ๋กฌํํธ ์ถ๋ ฅ
# Print system and task messages
print(
Fore.GREEN
+ f"AI Assistant sys message:\n{role_play_session.assistant_sys_msg}\n"
)
print(Fore.BLUE + f"AI User sys message:\n{role_play_session.user_sys_msg}\n")
print(Fore.YELLOW + f"Original task prompt:\n{task_prompt}\n")
print(
Fore.CYAN
+ "Specified task prompt:"
+ f"\n{role_play_session.specified_task_prompt}\n"
)
print(Fore.RED + f"Final task prompt:\n{role_play_session.task_prompt}\n")
์ข ๋ฃ ๊ท์น ์ค์ ๋ฐ ์์ด์ ํธ ์ํธ์์ฉ ์์
NOTE: ์ด ์ธ์ ์ Mistral Large 2 ๋ชจ๋ธ๋ก ์ฝ 8๋ถ์ด ๊ฑธ๋ฆฌ๊ณ ์ฝ 60k ํ ํฐ์ ์๋นํด์.
n = 0
input_msg = role_play_session.init_chat()
while n < 20: # Limit the chat to 20 turns
n += 1
assistant_response, user_response = role_play_session.step(input_msg)
if assistant_response.terminated:
print(
Fore.GREEN
+ (
"AI Assistant terminated. Reason: "
f"{assistant_response.info['termination_reasons']}."
)
)
break
if user_response.terminated:
print(
Fore.GREEN
+ (
"AI User terminated. "
f"Reason: {user_response.info['termination_reasons']}."
)
)
break
# Print output from the user
print_text_animated(
Fore.BLUE + f"AI User:\n\n{user_response.msg.content}\n",
0.01
)
if "CAMEL_TASK_DONE" in user_response.msg.content:
break
# Print output from the assistant, including any function
# execution information
print_text_animated(Fore.GREEN + "AI Assistant:", 0.01)
tool_calls: List[FunctionCallingRecord] = [
FunctionCallingRecord(**call.as_dict())
for call in assistant_response.info['tool_calls']
]
for func_record in tool_calls:
print_text_animated(f"{func_record}", 0.01)
print_text_animated(f"{assistant_response.msg.content}\n", 0.01)
input_msg = assistant_response.msg
# End the AgentOps session
agentops.end_session("Success")
๐ ์์ ํ์๋ AgentOps ๋งํฌ๋ก ๊ฐ๋ฉด ์ด๋ฒ ์คํ์ ๋ํ ์์ธ ๊ธฐ๋ก์ ๋ณผ ์ ์์ด์. (์ฐธ๊ณ : AgentOps ๋งํฌ๋ ๋น๊ณต๊ฐ์ด๋ฉฐ AgentOps ๊ณ์ ์ ์ฐ๊ฒฐ๋ผ์. ๋งํฌ์ ์ ๊ทผํ๋ ค๋ฉด ์์ ์ AgentOps API ํค๋ก ์ธ์ ์ ์คํํด์ผ ํฉ๋๋ค. ํ์ฌ AgentOps๋ Mistral AI์ ์คํ ๋น์ฉ์ ์ง์ ๊ฐ์ ธ์ฌ ์ ์์ด์.)
๐ [Neo4j Aura]์์ CAMEL ์์ด์ ํธ๊ฐ ์์ฑํ ์ง์ ๊ทธ๋ํ๋ฅผ ํ์ธํ ์๋ ์์ด์.
๐ ํ์ด๋ผ์ดํธ (Highlights)
์ด ๋ ธํธ๋ถ์ ๋ณต์กํ ๋ค์ค ์์ด์ ํธ ๋กคํ๋ ์ ์์ ์ ์ํ CAMEL RAG ์ํฌํ๋ก์ฐ๋ฅผ Firecrawl๊ณผ ํจ๊ป ์ค์ ํ๊ณ ์คํํ๋ ๋ฐฉ๋ฒ์ ์๋ดํ์ด์. ์ด ์์๋ ๊ณ ๊ธ ์น ์ ๋ณด ๊ฒ์๊ณผ AI ํ์ ์ด ํ์ํ ๋ค์ํ ๋ค๋ฅธ ์๋๋ฆฌ์ค์๋ ์ ์ฉยทํ์ฅํ ์ ์์ด์.
์ฃผ์ ์ฌ์ฉ ๋๊ตฌ:
- CAMEL: RAG์ ๋ค์ค ์์ด์ ํธ ๋กคํ๋ ์ ์๋๋ฆฌ์ค๋ฅผ ์ง์ํ๋ ๊ฐ๋ ฅํ ๋ค์ค ์์ด์ ํธ ํ๋ ์์ํฌ
- Mistral: ์ธ๋ถ ํจ์๋ฅผ ์คํํ๋ ๋๊ตฌ ํธ์ถ ๋ฅ๋ ฅ๊ณผ ๊ฐ๋ ฅํ ์๋ฒ ๋ฉ์ ์ ๊ณตํ๋ ์ต์ฒจ๋จ ์ธ์ด ๋ชจ๋ธ
- Firecrawl: ์น ํ์ด์ง์์ ์ฝํ ์ธ ๋ฅผ ์ถ์ถยท์ ๋ฆฌํ๋ ๊ฐ๋ ฅํ ์น ์คํฌ๋ํ ๋๊ตฌ
- AgentOps: CAMEL ์์ด์ ํธ์ ์คํ ์ถ์ ยท๋ถ์
- Qdrant: CAMEL์ AutoRetriever์ ํจ๊ป ๋ฒกํฐ ์ ์ฌ๋ ๊ธฐ๋ฐ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ ์ฅยท๊ฒ์ํ๋ ํจ์จ์ ์ธ ๋ฒกํฐ ์คํ ๋ฆฌ์ง ์์คํ
- Neo4j: ์ง์ ๊ทธ๋ํ ๊ตฌ์ถยท์ ์ฅ์ ์ฌ์ฉ๋๋ ์ ๋์ ์ธ ๊ทธ๋ํ DBMS
- DuckDuckGo Search: SearchToolkit ๋ด์์ ์ด๊ธฐ ์ฝํ ์ธ ๊ฒ์์ ๊ธฐ๋ณธ ๊ฒ์ ์์ง
- Unstructured IO: ๋น์ ํ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ฝํ ์ธ ์ฒญํน
CAMEL์ ๊ณ ๊ธ GraphRAG๋ ์ง์ํด์. ์์ธํ ๋ด์ฉ์ [์ฌ๊ธฐ]๋ฅผ ํ์ธํ์ธ์.
โญ ์คํ๋ ํ์ด ๋ฉ๋๋ค! CAMEL์ด ์ ์ฉํ๋ค๊ณ ์๊ฐ๋๋ฉด [GitHub]์ ์คํ๋ฅผ ์ฃผ๋ ๊ฑธ ๊ณ ๋ คํด ์ฃผ์ธ์.